gpt4 book ai didi

c++ - 来自文字的静态 std::string 对象的宏

转载 作者:IT老高 更新时间:2023-10-28 22:03:50 32 4
gpt4 key购买 nike

假设我需要调用一个函数 foo,它从我的代码中的很多地方获取一个 const std::string 引用:

int foo(const std::string&);
..
foo("bar");
..
foo("baz");

使用这样的字符串字面量调用函数将创建临时 std::string 对象,每次都复制字面量。

除非我弄错了,否则编译器不会通过为每个字面量创建一个静态 std::string 对象来优化它,该对象可以重复用于后续调用。我知道 g++ 有高级字符串池机制,但我认为它不会扩展到 std::string 对象本身。

我可以自己做这个“优化”,这会降低代码的可读性:

static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);

使用 Callgrind,我可以确认这确实加快了我的程序。

我想我会尝试为此制作一个宏,但我不知道这是否可能。我想要的是这样的:

foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));

我尝试使用文字作为模板参数创建模板,但事实证明这是不可能的。而且由于代码块中的函数定义是不可能的,所以我完全没有想法。

有没有一种优雅的方法可以做到这一点,还是我必须求助于可读性较差的解决方案?

最佳答案

如果该函数 foo 没有复制字符串,那么它的接口(interface)是次优的。最好将其更改为接受 char const*string_view ,因此调用者不需要构造 std::string

或者添加重载:

void foo(char const* str, size_t str_len); // Does real work.

inline void foo(std::string const& s) { foo(s.data(), s.size()); }
inline void foo(char const* s) { foo(s, strlen(s)); }

关于c++ - 来自文字的静态 std::string 对象的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740734/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com