可以在X86-64上有32位指针而没有不确定的行为?

问题描述 投票:0回答:0

struct small_pointer { uint32_t p; }; char load_small_pointer(struct small_pointer p, size_t index) { return *((char*)p + index); } <4GB buffer, and store 32-bit offsets into that buffer, but 几何涉及从一个

uint32_t

转换为

(char*)
,这可能是不确定的行为。该标准允许往返
uintptr_t

,但是我不知道其他类型的任何特殊津贴,即使我们的孔子遇到了从

uintptr_t
uint32_t
的转换应该是无损的。是否有任何标准的方法可以做到这一点?如果没有,GCC/CLANG是否提供任何特定实施的保证?
在情况下,您想知道为什么要这样做:“ Pointers”占用一半的数据缓存,而操作系统将特殊数据存储在地址范围的高或低端并不罕见。在这些情况下,需要其他针对某些对象的指针类型已经很自然了。将其表示为在运行时分配的一些缓冲区中的偏移量将涉及额外的负载(从指针到缓冲区的地址加载地址,然后从偏置位置加载实际负载)。
    
这是一个很好的定义,这是X32目标体系结构的原因,它为您提供针对X64处理器的32位指针。
窗户可以通过关闭PE可执行文件中的LargeadDressaware标志来获得正确的二进制行为,但我不知道您可以使用任何可用的工具来构建此类二进制文件。 (这是在移植64个位代码的早期问题的问题但是只能确保高点始终为零。)

c++ c pointers undefined-behavior pointer-conversion
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.