Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 为什么DNDEBUG标志会影响库大小?_Optimization_Cmake_G++_Compiler Flags - Fatal编程技术网

Optimization 为什么DNDEBUG标志会影响库大小?

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。有些项目依靠调试构建来半正常运行。例如,请参见操作系统安全邮

我正在尝试优化静态库foo.a的大小,并使用
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)
)相同)