gpt4 book ai didi

c++ - 强制 clang 为类模板实例化的从未引用的静态成员函数发出代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:03 25 4
gpt4 key购买 nike

我可以使用 usednoinlinegcc 中轻松实现此目的 function attributes (见下面的代码),但这在 clang 中不起作用,即使它应该支持这两个函数属性。

一个简化的例子:

template<typename T>
struct Factory {
static __attribute__((used, noinline))
T createFoo() { return T(); }
};

int main() {
Factory<int> f; // instantiate and use Factory<int>
}

编译 gcc 中的代码并使用 nm 确认 gcc 正确发出函数:

nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()

代码在 clang 中编译良好,但它不会像预期的那样为静态 createFoo() 函数发出代码。

我如何强制 clang 发出这个从未被引用的静态函数?

最佳答案

这绝对是 clang 的一个错误。

正如 OP 在评论中所述,__attribute__((used)) 的语义是将函数视为代码中引用的函数,强制它为函数发出代码,clang 在这种情况下没有这样做。

此外,所有类成员函数都具有 C++ 定义的外部链接。因此,当类被实例化时,编译器(支持 gcc 风格的函数属性)看到成员函数的 __attribute__((used)) 时,它应该立即知道该函数的外部可见定义应该被发射。 gcc 正在执行此操作,错误 clang 不是。

临时解决方法(针对 clang)是在代码中的某处显式引用该函数。

你还应该 file a clang bug report with llvm解决这个问题。

关于c++ - 强制 clang 为类模板实例化的从未引用的静态成员函数发出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971154/

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