c++ - 何时使用 __bswap_constant_XX 而不是 __bswap_XX?
问题描述
谁能告诉我两者之间有什么区别__bswap_constant_XX
以及__bswap_XX
何时更喜欢一个而不是另一个?
我正在使用 GCC 4.8
解决方案
首先,您通常不应该使用带有双下划线的符号,因为它们是reserved。
您正在谈论的符号不是编译器定义的,而是您的 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
推荐阅读
- python - 使用 R/Python/Unix 过滤/清理数据集
- jsonschema - JSON Schema 对象类型不适用于 $ref 定义
- asp.net-mvc - 为什么一个新的 ASP.NET Core 3.1 项目会生成不同版本的 bootstrap css?
- python - Python - 调用嵌套函数的正确方法?
- reactjs - React/Redux/Typescript - useDispatch 和 .then().catch()
- google-apps-script - Google Sheet - 如果复选框处于活动状态,则复制行
- arrays - 将结构嵌套到数组 C#
- c++ - 如何创建 C++ 映射 - 没有构造函数实例
- python - Spacy ValueError [E103] 在创建自定义 NER 时尝试设置冲突的 doc.ents
- docker - Private Gitlab Runner for code quality without Docker-in-Docker