代碼:
#include <iostream>
#include <type_traits>
int main() {
std::cout << "sizeof(size_t): " << sizeof(size_t) << std::endl;
std::cout << "sizeof(uint64_t): " << sizeof(uint64_t) << std::endl;
if constexpr (std::is_same_v<size_t, uint64_t>) {
std::cout << "size_t == uint64_t" << std::endl;
} else {
std::cout << "size_t != uint64_t" << std::endl;
}
}
結果:
sizeof(size_t): 8
sizeof(uint64_t): 8
size_t != uint64_t
編譯器資訊:
Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin21.6.0
Thread model: posix
size_t不等于有什么原因uint64_t嗎?如果是這樣,標準中是否特別提到了為什么會這樣?
uj5u.com熱心網友回復:
通常 typesize_t是 type 的別名unsigned long。
來自 C 標準(7.19 通用定義 <stddef.h>)
4用于 size_t 和 ptrdiff_t 的型別的整數轉換等級不應大于signed long int 的整數轉換等級,除非實作支持足夠大的物件以使其成為必要。
注意 typeunsigned long int的 rank 等于type 的 rank signed long int。
另一方面,型別uint64_t通常被定義為型別的別名unsigned long long int。雖然這是實作定義的。
至于您的代碼,那么顯示的輸出意味著sizeof( unsigned long int )在使用的系統上也等于 8。
uj5u.com熱心網友回復:
- size_t 型別是實作定義的無符號整數型別,它大到足以包含任何物件 ([expr.sizeof]) 的位元組大小。
- 推薦實踐:實作應該為 ptrdiff_t 和 size_t 選擇整數轉換等級 ([conv.rank]) 不大于signed long int 的型別,除非需要更大的大小來包含所有可能的值。
[支持.types]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515162.html
上一篇:帶有模板類的C 模板佇列
下一篇:不同型別佇列的向量
