gpt4 book ai didi

c++ - g++ : Using singleton in an embedded application

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:33 26 4
gpt4 key购买 nike

我正在使用 C++ 中的 GNU ARM 工具链使用 GCC 4.8 为 Cortex M3 开发嵌入式应用程序。该应用程序使用了一些通过函数局部静态变量实例化的单例,就像这样(真实代码):

GlobalDataTypeRegistry& GlobalDataTypeRegistry::instance()
{
static GlobalDataTypeRegistry inst;
return inst;
}

这是在 C++ 中实现单例的经典方法。问题是一旦我使用这种实例化,输出代码大小就会激增,这显然意味着编译器/链接器添加了一些服务代码以正确初始化/销毁单例对象。

这是允许重现问题的最小示例:

这将编译成 66k 代码 (-Os):

struct A
{
A() { __asm volatile ("nop"); }
~A() { __asm volatile ("nop"); }
};

A& getA()
{
static A a;
return a;
}

int main()
{
(void)getA();
return 0;
}

这将编译成 9k 代码 (-Os):

struct A
{
A() { __asm volatile ("nop"); }
~A() { __asm volatile ("nop"); }
};

static A a; // Extracted from the function scope
A& getA()
{
return a;
}

int main()
{
(void)getA();
return 0;
}

如果 (void)getA(); 行被完全注释掉,最终的二进制文件大小将约为 4k

问题是:除了从函数作用域中提取静态变量之外,我还有什么选择可以避免这个单例的额外 62k 代码?是否有任何选项可以告诉 GCC 没有必要在应用程序退出时调用单例的析构函数(因为它永远不会退出)?还有其他优化方法吗?

最佳答案

-fno-threadsafe-statics选项添加到g++命令,您的代码大小将减少。

这是我的示例代码:

class X {
private:
X() { };

public:
~X() { };

static X* get_instance() {
static X instance;
return &instance;
}

void show() {
asm("");
}
};


int main() {
X* temp = X::get_instance();
temp->show();

while (true) {
asm("");
}
}

引用资料:

关于c++ - g++ : Using singleton in an embedded application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22985570/

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