Optimization 为什么DNDEBUG标志会影响库大小?
我正在尝试优化静态库foo.a的大小,并使用Optimization 为什么DNDEBUG标志会影响库大小?,optimization,cmake,g++,compiler-flags,Optimization,Cmake,G++,Compiler Flags,我正在尝试优化静态库foo.a的大小,并使用CMAKE\u BUILD\u类型MINSIZEREL编译它(添加-Os和-DNDEBUG标志) 生成的库大小为307K 现在,如果我只使用-Os标志编译,库会缩小(非常小)到304k 据我所知,使用-D标志创建预处理器定义。为什么这会影响库的最终大小 谢谢你的帮助 -DNDEBUG将生成移动到准发布状态。调试版本中存在的代码路径和符号不再存在于发布版本中。在Linux上小心-DNDEBUG。有些项目依靠调试构建来半正常运行。例如,请参见操作系统安全邮
CMAKE\u BUILD\u类型MINSIZEREL编译它(添加-Os
和-DNDEBUG
标志)
生成的库大小为307K
现在,如果我只使用-Os
标志编译,库会缩小(非常小)到304k
据我所知,使用-D
标志创建预处理器定义。为什么这会影响库的最终大小
谢谢你的帮助 -DNDEBUG
将生成移动到准发布状态。调试版本中存在的代码路径和符号不再存在于发布版本中。在Linux上小心-DNDEBUG
。有些项目依靠调试构建来半正常运行。例如,请参见操作系统安全邮件列表。这是不寻常的。通常,当断言变为无操作时,您会期望使用-DNDEBUG进行代码收缩。可以想象,编译器可以使用断言来指导概率,这可能会导致启用断言而不是禁用断言时的代码收缩,但我通常不会期望它超过代码增长,因为存在断言代码。如果在(0)
时为自己的assert.h提供#define assert(X)do{if(!(X))u builtin_unreachable()}会发生什么情况?您确定您的库没有#if NDEBUG/*…*/一些本应是#if!NDEBUG/*…*/一些代码
(或分别与\ifdef
\ifndef
相同,或与\if defined(NDEBUG)
\if!defined(NDEBUG)
)相同)-DNDEBUG
将构建移动到准发布状态。调试版本中存在的代码路径和符号不再存在于发布版本中。在Linux上小心-DNDEBUG
。有些项目依靠调试构建来半正常运行。例如,请参见操作系统安全邮件列表。这是不寻常的。通常,当断言变为无操作时,您会期望使用-DNDEBUG进行代码收缩。可以想象,编译器可以使用断言来指导概率,这可能会导致启用断言而不是禁用断言时的代码收缩,但我通常不会期望它超过代码增长,因为存在断言代码。如果在(0)时为自己的assert.h提供#define assert(X)do{if(!(X))u builtin_unreachable()}会发生什么情况?您确定您的库没有#if NDEBUG/*…*/一些本应是#if!NDEBUG/*…*/一些代码
(或分别与#ifdef
->#ifndef
相同,或与#if定义(NDEBUG)
->#if!定义(NDEBUG)
)相同)