g++:在嵌入式应用程序中使用singleton
g++: Using singleton in an embedded application
我正在用C++中的GNU ARM工具链为Cortex M3和GCC 4.8开发一个嵌入式应用程序。应用程序使用一些通过函数局部静态变量实例化的singleton,比如(真实代码):
GlobalDataTypeRegistry& GlobalDataTypeRegistry::instance()
{
static GlobalDataTypeRegistry inst;
return inst;
}
这是在C++中实现singleton的经典方法。问题是,一旦我使用这样的实例化,输出代码的大小就会爆炸,这显然意味着编译器/链接器添加了一些服务代码,用于对singleton对象进行正确的初始化/销毁。
以下是允许重现问题的最小示例:
这将编译成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("");
}
}
参考文献:
- http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html
- http://arkaitzj.wordpress.com/2009/11/07/static-locals-and-threadsafety-in-g/
您可以在用std::aligned_storage实现的缓冲区内创建新的单例。
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- g++:在嵌入式应用程序中使用singleton