加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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是否支持此类优化?

解决方法

是的,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读