GCC编译ARM EABI目标时,类模板静态成员使用[[gnu::noinit]]属性引发段类型错误的问题求助
GCC编译ARM EABI目标时,类模板静态成员使用[[gnu::noinit]]属性引发段类型错误的问题求助
我现在尝试给类模板的静态成员变量添加[[gnu::noinit]]属性,代码如下:
template <typename T> struct Instantiator { static T obj; }; template <typename T> [[gnu::noinit]] T Instantiator<T>::obj; constinit int* p = & Instantiator<int>::obj;
用GCC v15.2.0编译ARM EABI目标时,我收到了这样的警告:
/tmp/cc25jMnj.s:19: Warning: setting incorrect section type for .noinit._ZN12InstantiatorIiE3objE
GCC生成的汇编代码是这样的:
.weak _ZN12InstantiatorIiE3objE .section .noinit._ZN12InstantiatorIiE3objE,"awG",%progbits,_ZN12InstantiatorIiE3objE,comdat .align 2 .type _ZN12InstantiatorIiE3objE, %object .size _ZN12InstantiatorIiE3objE, 4 _ZN12InstantiatorIiE3objE: .space 4
问题在于GCC试图给.noinit段设置%progbits属性,这完全不合理——显然我不希望输出段里包含任何初始化数据。如果我手动把汇编文件里的%progbits改成%nobits,就能正常工作。
我想知道:有没有办法让GCC停止生成%progbits属性,改成%nobits?
另外,我也可以接受GCC生成这样的代码,也就是不要把符号放到段组里,也不要附加那些属性:
.section .noinit._ZN12InstantiatorIiE3objE,"aw"
模板实例化不需要放在头文件里,这对我来说没问题。
补充一下背景:我想用Instantiator类作为一种内联单例分配器,也就是Instantiator<T>::obj是静态分配的对象,可以用来定义全局变量,不需要为每个使用场景额外写代码。T类型可能很大(比如I/O缓冲区),所以这些缓冲区不需要每次启动都初始化(启动时间和能耗是关键因素)。而且我只会在源文件里使用Instantiator,所以不会出现重复定义的问题。
备注:内容来源于stack exchange,提问作者Erlkoenig
相关产品推荐
相关产品推荐

