提问人:Shabble 提问时间:11/28/2022 更新时间:11/28/2022 访问量:153
瘦身未使用的 std::stringstream 语言环境/分面以供嵌入式使用?
slimming unused std::stringstream locale/facets for embedded use?
问:
我目前正在为 C++ 中的低规格 ARM Cortex M4 构建一个应用程序,使用静态链接的 stdlibc++。arm-none-eabi-g++
代码的某些部分目前用于构造用于各种目的的字符串,并且很难从代码库中删除/重构。std::stringstream
代码的一个相当基本的子集,所有字符串流都垫片
(通过标题,如下所示:fakestream.h
namespace blah {
class stringstream {
stringstream() {}
~stringstream() {}
std::string str() {
return "dummy";
}
template<typename T>
stringstream& operator<<(T val) {
return *this;
}
};
}
随着调用更改为:
#include "fakestream.h"
using blah::stringstream;
...
stringstream ss;
ss << ...
与使用 std::stringstream 相比,从应用程序中修剪大约 350kB 的代码。
我意识到确实需要一些代码,但是当使用 bloaty 检查生成的 .elf 时, 很多空间似乎都被以下功能占用了:
6.5% 20.0Ki std::num_get<>::_M_extract_int<>()
3.7% 11.3Ki std::__cxx11::money_get<>::_M_extract<>()
2.9% 8.97Ki std::money_get<>::_M_extract<>()
2.7% 8.24Ki d_print_comp_inner
2.3% 6.97Ki _svfprintf_r
2.1% 6.42Ki _svfwprintf_r
2.0% 6.11Ki __strftime.isra.0
2.0% 6.09Ki __ssvfscanf_r
1.8% 5.61Ki __ssvfiscanf_r
1.8% 5.54Ki std::__cxx11::time_get<>::_M_extract_via_format()
1.5% 4.65Ki std::num_get<>::_M_extract_float()
1.4% 4.29Ki std::__cxx11::money_put<>::_M_insert<>()
1.4% 4.24Ki std::num_get<>::do_get()
1.4% 4.17Ki std::__moneypunct_cache<>::_M_cache()
1.3% 3.96Ki _strtod_l
1.3% 3.89Ki _vfiprintf_r
1.3% 3.87Ki std::time_get<>::_M_extract_via_format()
1.2% 3.81Ki _dtoa_r
1.2% 3.64Ki std::money_put<>::_M_insert<>()
1.1% 3.53Ki std::locale::_Impl::_Impl()
1.1% 3.28Ki std::__facet_shims::__moneypunct_fill_cache<>()
1.1% 3.27Ki _svfiprintf_r
1.0% 3.21Ki std::num_put<>::_M_insert_int<>()
0.8% 2.54Ki std::num_put<>::_M_insert_float<>()
0.7% 2.11Ki d_type
0.6% 1.94Ki std::__cxx11::time_get<>::_M_extract_name()
而且我确信我没有对 stringstream 或其他任何地方使用任何或相关的类/值。money
time
据我所知,可能会发生一些与区域设置相关的间接操作,或者允许根据活动区域设置对这些类型进行格式化,但我在此应用程序中不需要任何这些。ios
ios_base
是否有可能以某种方式表明这些功能是不必要的,应该从最终输出中省略?
理想情况下,可以继续直接使用,但将其替换为代理或类似内容(但这实际上委托了格式化基本整数类型、字符串和一些自定义对象重载的必要功能)。std::stringstream
答: 暂无答案
评论
fmt
stringstream
-O0
-Og
-Os