Use c_str(), not str() for IdString/std::string == and != operators
authorRupert Swarbrick <rswarbrick@gmail.com>
Tue, 26 May 2020 10:51:06 +0000 (11:51 +0100)
committerRupert Swarbrick <rswarbrick@gmail.com>
Tue, 26 May 2020 11:27:15 +0000 (12:27 +0100)
These operators work by fetching the string from the global string
table and then comparing with the std::string that was passed in as
rhs.

Using str() means that we create a std::string (strlen; malloc;
memcpy), compare for equality (another memcmp if they have the same
length) and then finally free the string.

Using c_str() means that we pass the const char* straight to
std::string's equality operator. This ends up as a call to
std::string::compare (the const char* flavour), which is essentially
strcmp.

kernel/rtlil.h

index 11c45bbec77904615e85d669cfd5b2a181fb1bcb..10bfc13f22764c9fd4987f1b0eda9af2f5559747 100644 (file)
@@ -296,8 +296,8 @@ namespace RTLIL
 
                // The methods below are just convenience functions for better compatibility with std::string.
 
-               bool operator==(const std::string &rhs) const { return str() == rhs; }
-               bool operator!=(const std::string &rhs) const { return str() != rhs; }
+               bool operator==(const std::string &rhs) const { return c_str() == rhs; }
+               bool operator!=(const std::string &rhs) const { return c_str() != rhs; }
 
                bool operator==(const char *rhs) const { return strcmp(c_str(), rhs) == 0; }
                bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; }