gpt4 book ai didi

c - 为什么 size_t 更好?

转载 作者:太空狗 更新时间:2023-10-29 16:46:28 24 4
gpt4 key购买 nike

标题实际上有点误导,但我想保持简短。我读过为什么我应该使用 size_t 并且我经常发现这样的语句:

size_t is guaranteed to be able to express the maximum size of any object, including any array

我不太明白这是什么意思。一次可以分配多少内存是否有某种上限,并且 size_t 保证足够大以计算该内存块中的每个字节?

Follow-up question:
What determines how much memory can be allocated?

最佳答案

假设您的编译器/平台可以拥有的最大对象是 4 GB。 size_t 则为 32 位。现在假设您在能够支持大小为 2^43 - 1 的对象的 64 位平台上重新编译您的程序。size_t 将至少为 43 位长(但此时通常为 64 位).关键是你只需要重新编译程序。您不必将所有 int 更改为 long(如果 int 是 32 位并且 long 是64 位)或从 int32_tint64_t。(如果你问自己为什么是 43 位,假设 Windows Server 2008 R2 64 位不支持大小为 2^63 的对象,也不支持大小为 2^62 的对象......它支持 8 TB 的可寻址空间......所以43 位!)

许多为 Windows 编写的程序认为指针与 DWORD(32 位无符号整数)一样大。如果不重写大量代码,这些程序无法在 64 位上重新编译。如果他们使用 DWORD_PTR(一个无符号值,保证大小与包含指针一样大),他们就不会遇到这个问题。

size_t“点”是类似的。 但不同!

size_t 不保证能够包含指针!!
(Microsoft Windows 的 DWORD_PTR 是)

这通常是非法的:

void *p = ...
size_t p2 = (size_t)p;

例如,在旧的 DOS“平台”上,对象的最大大小为 64k,因此 size_t 需要为 16 位但是需要一个远指针至少20位,因为8086有1mb的内存空间(最后一个远指针是16 + 16位,因为8086的内存是分段的)

关于c - 为什么 size_t 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com