嵌入式 C++ 中 std::ios_base::Init 类的意义是什么,可以省略吗?

问题描述

我正在使用 C++ 17 为 STM32F4 系列微控制器编写代码。使用 arm-none-eabi g++ 版本 9.3.1 20200408 (release) (GNU Arm Embedded Toolchain 9-2020-q2-update)

我正在使用 std::tuple、std::variant 和其他一些通常会使代码膨胀的东西。但是我注意到我的代码太臃肿了。所以我开始使用链接器选项,并到了代码被破坏的地步,因为它缺少 std::ios_base::Init 构造函数和析构函数。我在代码添加了空白实现,一切又开始工作了。我没有注意到代码有任何问题。

我的代码在 O0 优化中从 300k 下降到 65k,并通过 Os 标志进一步减少到 17.5k。

链接器选项:

arm-none-eabi-g++ -v -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics -fno-use-cxa-atexit -Wall -fstack-usage --specs=nano.specs -mthumb -Wl,--gc-sections -Wl,--start-group -lm -lc -lgcc -lnosys -T ../../../../../armlib/gcc/STM32F429ZI/System/flash.ld ...

现在我的问题是,我是否通过省略 std::ios_base::Init 的实现来破坏某些东西? 为什么要拉出我没有在代码中明确使用的所有位置的东西?我确实使用 std::string_view,所以可能从那里汇集..

仅保留 Init 时代码中包含的一些函数

1> 134276844 00001524 W _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw
1> 134276844 00001524 t _ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw.localalias
1> 134315756 00001526 W _ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKc
1> 134315756 00001526 t _ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKc.localalias
1> 134252068 00001530 W _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc
1> 134252068 00001530 t _ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc.localalias
1>    text     data     bss     dec     hex filename
1>  176460      772   11120  188352   2dfc0 Output/Release External/Exe/Bloaty.elf

然后在魔术执行之后

namespace std{
ios_base::Init::Init(){}
ios_base::Init::~Init(){}
}

所有本地化的东西都消失了,代码是:

1>    text     data     bss     dec     hex filename
1>   18824      144    5360   24328    5f08 Output/Release External/Exe/Bloaty.elf

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)