很长一段时间以来,我理所当然的认为 sizeof(int) 是根据编译目标变化的,比如: x86 下应该为 4 Bytes (32-bits),x64 模式下应该为 8 Bytes(64 bits)。但是近日有朋友遇到了问题,我随手实验,用 printf 输出 sizeof(int) 和 sizeof(int *) 结果令我大吃一惊:
x86 下 sizeof(int) ==4 , sizeof(int *)==4
x64 下 sizeof(int) ==4 , sizeof(int *)==8
就是说, x64 下内存指针变成了8Bytes, 但是 int 仍然是 4bytes。无他,规定如此耳。
所以,在编写 UEFI 代码的时候,尽量不要使用 int 类型,因为你在代码中随手写下的赋值可能会因为编译目标不同而导致令人疑惑的错误。作为 Firmware 工程师,需要时刻了解数据的大小。
参考:
1.https://docs.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=msvc-160
2.https://www.geeksforgeeks.org/difference-between-sizeofint-and-sizeofint-in-c-c/
3.https://docs.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=msvc-160
Sizes of built-in types
Most built-in types have implementation-defined sizes. The following table lists the amount of storage required for built-in types in Microsoft C++. In particular, long is 4 bytes even on 64-bit operating systems.
| Type | Size |
|---|---|
bool, char, char8_t, unsigned char, signed char, __int8 | 1 byte |
char16_t, __int16, short, unsigned short, wchar_t, __wchar_t | 2 bytes |
char32_t, float, __int32, int, unsigned int, long, unsigned long | 4 bytes |
double, __int64, long double, long long, unsigned long long | 8 bytes |
如果需要存储地址应该用 ptrdiff_t(带符号)或 size_t(无符号),参见
https://en.cppreference.com/w/cpp/types/ptrdiff_t
https://en.cppreference.com/w/cpp/types/size_t
谢谢指教,回头我研究一下。