问题描述
我正在使用 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,所以可能从那里汇集..
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 (将#修改为@)