C++ sizeof(size\u t)==sizeof(void*)是否始终为真?

C++ sizeof(size\u t)==sizeof(void*)是否始终为真?,c++,c,types,standards,compatibility,C++,C,Types,Standards,Compatibility,C99/C++11标准是否保证sizeof(size\u 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? } 不,这不是保证。使用intptr\u t或uintpr\u t安全地将指针存储在整数中 有些体系结构是错误的,比如分段DOS内存模型。在那里,内存是以6

C99/C++11标准是否保证
sizeof(size\u 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?
}

不,这不是保证。使用
intptr\u t
uintpr\u t
安全地将指针存储在整数中


有些体系结构是错误的,比如分段DOS内存模型。在那里,内存是以64k段的形式构建的——一个对象永远不会比一个段大,所以16位
size\u t
就足够了。但是,指针有“段”和“偏移”部分,因此根据定义,指针必须大于16位才能引用不同的段。

我不明白为什么投票支持关闭。这是一个合理的问题。@Nawaz+1。我想自从“展示最低限度的知识”成为结束语后,有些人觉得有必要将其应用得过于广泛。
size\u t
void*
是两种不相关的类型。为什么他们应该是平等的呢?我知道
size\u t
试图存储最大的数字,而
void*
则是指针试图访问最大的内存地址空间。但它并没有说它们必须相等。Related:@deepmax:更准确地说,
size\u t
是可寻址的最大连续字节数(数组的最大长度)。如果使用分段内存,或者如果使用的是X86—64(64位指针,只有48位是可用的,在地址空间中间有一个),那么这可能远远低于整个地址空间。.不幸的是,
intptr\u t
uintptr\u t
是可选类型,可能存在一些架构,这些架构没有足够大的整型来包含
void
指针。@BryanOlivier确实如此。然而,如果一个平台支持足够大的整数,我肯定会期望标准库通过这些typedef来公开它。如果平台不这样做,
size\u t
也不会有帮助。所以我想说,这些类型的存在可以作为一个指标,表明这样的强制转换是否可行。@VivekS不,
size\u t
实际上是针对对象大小的。大多数现代编译器将支持
intptr\u t
uintptr\u t
,因为否则
%p
格式说明符无法在C中实现。@VivekS
size\u t
被定义为无符号整数类型,能够存储最大对象的大小(理论上)由程序创建。@delnan
memcpy()
怎么样?记住,我们讨论的是编译器/库实现,它们知道内存中指针的位模式。