C/C++中的编译时按位运算
发布时间:2020-12-16 09:57:18 所属栏目:百科 来源:网络整理
导读:我试图了解C/C++编译器如何处理按位操作. 具体来说,我说的是用 gcc编译的C语言,但我相信这个问题比这更为笼统. 无论如何,假设我有一个定义如下的宏: #define SOME_CONSTANT 0x111UL #define SOME_OFFSET 2 #define SOME_MASK 7 #define SOME_VALUE ((SOME_C
我试图了解C/C++编译器如何处理按位操作.
具体来说,我说的是用 gcc编译的C语言,但我相信这个问题比这更为笼统. 无论如何,假设我有一个定义如下的宏: #define SOME_CONSTANT 0x111UL #define SOME_OFFSET 2 #define SOME_MASK 7 #define SOME_VALUE ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK) static inline void foo() { printf("Value: %lu#n",SOME_VALUE); } SOME_VALUE的所有成分都是常量,它们在编译时都是已知的. 所以我的问题是:gcc会在编译时评估SOME_VALUE,还是仅在运行时完成? 解决方法
是的,gcc将优化它,因为它是一个完全不变的表达式.
要查看汇编代码,请查看此工具https://gcc.godbolt.org/ #include <stdio.h> #define SOME_CONSTANT 0x111UL #define SOME_OFFSET 2 #define SOME_MASK 7 #define SOME_VALUE ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK) void foo() { printf("Value: %lu#n",SOME_VALUE); } 我不得不稍微修改你的代码,否则gcc会优化整个事情而不留下任何东西! .LC0: .string "Value: %lu#n" foo(): movl $4,%esi movl $.LC0,%edi xorl %eax,%eax jmp printf (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |