函数本地静态变量是否阻止函数内联?
问题描述:
我在写一个属性填充以从库的字符串实现中获取原始c-string。这个特定的字符串类,例如string_t
具有成员length()
和data()
。 当length() == 0
data() == nullptr
。函数本地静态变量是否阻止函数内联?
现在我正在使用不喜欢空字符串的api,因此我的填充函数返回空字符串的地址。
inline char const* get_safe_c_str(string_t const& str){
static char const empty[] = "";
return str.length() > 0 ? str.data() : ∅
}
是否我的静态变量阻止编译器内联这个函数?
答
不,它不会阻止内联。仍然只有一个函数本地静态变量的实例,并且在函数的任何位置都以内联方式展开,则将使用该实例。
无论是特定的编译器与特定选项实际上内联这样的功能是另一回事,你不得不编译程序,看看你的编译器实际上做了,但没有技术原因的功能罐”内联t。
但是请注意,在您的程序中,return str.length() > 0 ? str.data() : "";
也可以正常工作;一个字符串文字具有静态存储持续时间并存在,直到程序终止。
顺便说一句,你可以返回字符串文字的地址。他们的一生是整个程序(或者dll的生命周期,如果你是动态加载和卸载的,但是就标准而言,这是不合适的,并且不会比你的本地静态更糟) –
真的吗?很酷。这比静态数组好得多。 – Flame
我刚刚注意到上面的代码有问题,我返回的是数组的地址,而不是第一个元素的地址。这不会编译,因为你不能从'char const(*)[1]'(指向char数组的指针)转换为'char const *'(指向char的指针)。 – Flame