何时使用 __bswap_constant_XX 而不是__bswap_XX?
When to use __bswap_constant_XX instead of __bswap_XX?
谁能告诉我__bswap_constant_XX
和__bswap_XX
之间有什么区别,以及什么时候更喜欢一个而不是另一个?
我正在使用 GCC 4.8
首先,您通常不应使用带有双下划线的符号,因为这些符号是保留的。
您正在谈论的符号不是编译器定义的,而是 C 库的一部分。bswap_XX
宏可以使用编译器内部甚至内联汇编来使编译器生成特定于 CPU 的指令,从而使结果在编译时未知。
相反,__bswap_constant_XX
应该使用简单的 C 表达式计算值,如果输入是编译时常量,则使值编译时常量。
此类宏可以定义为:
#define __bswap_constant_16(x)
((__uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
#define __bswap_constant_32(x)
((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) |
(((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))
这个想法是,当你需要编译时值时,例如在定义枚举值时,你应该使用__bswap_constant_XX
:
enum myenum {
MYVALUE = __bswap_constant_16(0x1234)
};
bswap_XX
应该在所有其他情况下使用。
请注意,现代编译器能够识别简单的字节交换模式并生成适当的指令,因此在实践中,这在大多数情况下不会产生影响。
例如,对于这两个函数:
uint16_t bswap16(uint16_t x)
{
return __bswap_constant_16(x);
}
uint32_t bswap32(uint32_t x)
{
return __bswap_constant_32(x);
}
GCC 4.8.1 生成:
bswap16:
mov eax, edi
rol ax, 8
ret
bswap32:
mov eax, edi
bswap eax
ret
相关文章:
- C++ 将打印格式从整数 2255 更改为 $xx.xx
- 为什么这个.c文件只有一行"../xx/xx.c"?
- 无法在打开的 cv 3.xx 中画线
- 在静态成员函数中无效使用成员“xx::x”
- 平息海湾合作委员会的"only available with -std=c++XX or -std=gnu++XX"警告
- ITK:在执行 HelloWorld 示例时找不到 ITKCommon-x.xx.dll
- Windows C++ UWP:等待 XX 毫秒,直到事件发生
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- Qt5:如何修改下载速度以显示 1.xx MB/s 而不是 1.xxxxx MB/s
- LoadLibrary(xx.dll) with error 126
- 基于内核版本 X.XX 构建的 C++ Linux 应用是否会在早期版本上运行
- 是否有可以在控制台中设置颜色的 WinAPI 调用,如'color xx'命令?
- 查找科学记数法 (E+XX)
- 字符串打印机问题:参数 X 没有从“char (*)[xx]”到“char**”的已知转换
- CXX 中"XX"的内容在 cmake CMakeLists.txt 文件中
- 如何解决错误:"Missing required Boost components >= vX.XX, please install/upgrade Boost or configure you
- VS 2010 - #pragma 注释(lib,XX)有效,其他依赖项无效。为什么?
- const XX放弃限定符[- fpermissive]
- GDB 不断产生"No line xx in file"错误,即使文件包含以下行
- 将"../xx.txt"追加到相对路径确实适用于C++