我的基本情况:我有一个类似的包含文件#define foo (Flag1 | Flags2 | Flag3),所以它是一个预定义的位标志组合.为了类型安全,我想用静态consts替换这些#defines,即static const int foo = (Flag1 | Flag2 | Flag3)(或类似).这个包含文件包含在程序的许多地方.
现在当我在启用所有相关优化选项的发布版本时(使用VS2010的C++编译器),替换#defines似乎会将可执行文件增加几个KiB,具体取决于我替换了多少常量.
为什么会这样?据我所知,整数常量应该被"内联"到尽可能产生的ASM代码中,我不知道使用static constvs #define会如何在这里产生影响.很明显,变量没有内联,因为反汇编显示:
#define:
01325041 or eax,0FFD87FE0h
static int:
011E5451 or eax,dword ptr [CMainFrame::s_TemplateModulePaths+38h (151F008h)]
Run Code Online (Sandbox Code Playgroud)
所以最后一个问题是:我如何避免#define但仍然依赖于直接插入到生成的程序集中的变量?
正如评论中所见,类型安全运算符| 我的枚举的重载似乎阻止了 VC++ 内联 ORed 值。我想我会继续使用该#define版本,因为如果没有好处,我讨厌增加可执行文件的大小(不,这不是过早的优化) - 毕竟,它不会增加可读性,而且由于标志的组合已经是我的flagset 枚举类型,我想我也不会失去任何类型安全。
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |