You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:18:13