函数局部静态变量是否会阻止函数内联?

发布于 2024-11-30 01:46:18 字数 441 浏览 0 评论 0原文

我正在编写一个属性垫片以从库的字符串实现中获取原始 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

此生挚爱伱 2024-12-07 01:46:18

不,它不会阻止内联。函数局部静态变量仍然只有一个实例,并且在函数内联扩展的任何地方,都会使用该实例。

具有特定选项的特定编译器是否实际上内联这样的函数是另一回事,并且您必须编译程序才能查看编译器实际执行的操作,但是没有技术原因该函数 >不能内联。

但请注意,在您的程序中,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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文