I'm trying to optimize my software and to do that I need to change the way I store and draw things.
Many people say that fmt is way faster than iostream at doing those things, yet I'm sitting here and trying to understand what I did wrong.
The old code is working:
auto type = actor->GetName();
char name[0x64];
if (type.find("AI") != std::string::npos)
sprintf(name, "AI [%dm]", dist);
The new one isn't:
auto type = actor->GetName();
char name[0x64];
if (type.find("AI") != std::string::npos)
fmt::sprintf("AI [%dm]", dist);
What am I doing wrong?
CodePudding user response:
As @NathanPierson mentioned in comments, fmt::sprintf()
return a std::string
, which you are ignoring. fmt::sprintf()
does not fill a char[]
buffer (not that you are passing one in to it anyway, like you were with ::sprintf()
).
Change this:
char name[0x64];
fmt::sprintf("AI [%dm]", dist);
To this:
std::string name = fmt::sprintf("AI [%dm]", dist);
And then you can use name
as needed. If you need to pass it to a function that expects a (const) char*
, you can use name.c_str()
or name.data()
for that purpose.
CodePudding user response:
Many people say that fmt is way faster than iostream at doing those things, yet I'm sitting here and trying to understand what I did wrong.
In addition to Remy Lebeau's correct answer, there's another point. You mentioned speed as a consideration. In that case, you may want avoid constructing an std::string
, and use fmt::format_to_n()
(or std::format_to_n
) to format into your char buffer directly:
auto type = actor->GetName();
char name[0x64];
if (type.find("AI") != std::string::npos) {
fmt::format_to_n(name, 0x64, "AI [{}m]", dist);
}
Unfortunately, I don't think fmt
has a function which targets an existing buffer and uses printf format specifiers.