函数局部静态变量是否会阻止函数内联?
我正在编写一个属性垫片以从库的字符串实现中获取原始 C 字符串。这个特定的字符串类,例如 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() : ∅
}
我的静态变量是否会阻止编译器内联此函数?
I'm writing an attribute shim to get the raw c-string from a library's string implementation. This specific string class, say string_t
has members length()
and data()
.
When length() == 0
data() == nullptr
.
Now I am using an api that doesn't like null strings so my shim returns the address of an empty string.
inline char const* get_safe_c_str( string_t const& str ){
static char const empty[] = "";
return str.length() > 0 ? str.data() : ∅
}
Does my static variable prevent the compiler from inlining this function?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,它不会阻止内联。函数局部静态变量仍然只有一个实例,并且在函数内联扩展的任何地方,都会使用该实例。
具有特定选项的特定编译器是否实际上内联这样的函数是另一回事,并且您必须编译程序才能查看编译器实际执行的操作,但是没有技术原因该函数 >不能内联。
但请注意,在您的程序中,
return str.length() > 0 ? str.data() : "";
也可以正常工作;字符串文字具有静态存储持续时间并一直存在直到程序终止。No, it does not prevent inlining. There will still be only one instance of the function-local static variable, and everywhere the function is expanded inline, that instance will be used.
Whether a particular compiler with particular options actually inlines such a function is another matter, and you'd have to compile your program to see what your compiler actually does, but there is no technical reason the function can't be inlined.
Note, however, that in your program,
return str.length() > 0 ? str.data() : "";
would also work fine; a string literal has static storage duration and exists until the program terminates.