sizeof(size_t) == sizeof(void*)是否总是成立?

22

C99/C++11标准是否保证sizeof(size_t) == sizeof(void*)始终成立?

size_t f(void* p)
{
    return (size_t)(p); // Is it safe?
}

void* f(size_t n)
{
    return (void*)(n); // Is it safe?
}

8
我不明白为什么有人投票要关闭这个问题,它是一个合法的问题。 - Nawaz
5
自从“展示最小知识”成为关闭问题的原因以来,一些人似乎感觉有必要过度应用它。 - Angew is no longer proud of SO
1
size_tvoid*是两种不相关的类型。为什么它们应该相等呢?我知道size_t试图存储最大的数字,而void*作为指针则试图访问最大的内存地址空间。但这并不意味着它们必须相等。 - masoud
相关:size_t vs. intptr_t - masoud
1
@deepmax:更准确地说,size_t是可寻址的最大连续字节数(数组的最大长度)。如果您使用分段内存或类似x86-64(64位指针;其中只有48位可用,并且地址空间中间有一个巨大的空洞),则这可以远低于整个地址空间。 - Andon M. Coleman
1个回答

14
不,这并不是保证的。使用 intptr_tuintptr_t 将指针安全地存储在整数中。
有/曾经有一些结构下,这个说法是错误的,比如分段式DOS内存模型。在那里,内存被分为64k个段,一个对象永远不能大于一个段,所以16位的 size_t 将足够。然而,指针有 "段" 和 "偏移量" 部分,因此它必须比16位大才能引用不同的段。

2
不幸的是,intptr_tuintptr_t是可选类型,可能存在某些架构,没有足够大的整数类型来包含void指针。 - Bryan Olivier
1
@BryanOlivier 确实如此。但是,如果平台支持足够大的整数,我肯定会期望 std.库通过这些 typedefs 公开它。如果平台不支持,size_t也无济于事。因此,我认为这些类型的存在可以用作指示器,以确定是否可能进行这样的转换。 - Angew is no longer proud of SO
2
@VivekS 不,size_t 真的是用于对象大小的。大多数现代编译器都支持 intptr_tuintptr_t,否则在 C 中无法实现 %p 格式说明符。 - Bryan Olivier
3
size_t被定义为一种无符号整数类型,能够存储程序在理论上可以创建的最大对象的大小。 - Angew is no longer proud of SO
1
@delnan memcpy() 怎么样?记住,我们在讨论编译器/库的实现,它们知道指针在内存中的位模式。看例子 - Angew is no longer proud of SO
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接