在指针大小为 4 字节的系统上,当意图只是寻址可通过两个字节(下部)寻址的内存部分时,是否可以将指针存储为两个字节的 WORD 当它不在某个 cpu 中时登记?我没有看到任何原因,假设我们通过声明如下指针获得了任何类似名为“twoBytes”的字:
char * pointer = reinterpret_cast<char *>((unsigned int)(twoBytes))
我们正在引入一个全新的 4 字节实体,它将被保存为 4 字节实体。
通常,您可以存储几乎不需要的信息来恢复原始指针值,所以是的,您可以,尽管它超出了语言提供的保证(您需要确定您的特定编译器如何处理重新解释强制转换)。
但是,在例如 Windows 中,您唯一可以确定的是 32 位指针的高位字对于用户代码是非零的(空指针除外)。这在MAKEINTATOM等 Windows API 宏中是隐含的。如果最重要的单词可能为零,那么 API 就无法可靠地区分表示小整数的指针和指向文本字符串的指针。
所以,一般来说,除非你在做内核编程,否则这种优化不会给你带来任何好处。此外,节省几个字节很少值得增加复杂性。
干杯&hth.,
您所描述的听起来更像是编译器功能(老式的“近”指针),而不是您可以从语言内部执行的操作。与制作您正在使用的编译器的人一起讨论。我可以保证能够在 GCC 中实现这种行为的理论上的可能性,尽管我怀疑这将是一个巨大的痛苦。
作为另一种技巧,您可以使用基指针和“无符号短”偏移量来获得大部分想要的东西。
不,出于同样的原因,您不能将单词“bike”存储在两个字节中。数据不合适。不要将指针转换为非指针类型,它通常是不可移植的,并且可能会默默地引入截断并导致一些讨厌的错误。
您也可以在没有命名的 4 字节实体的情况下使用它:
((char*)(unsigned)twoBytes)[idx] = some_val;
twoBytes
只会占用内存中的两个字节。当您将其转换为 char* 时,您的编译器将生成一个 4 字节的值来实际寻址数据,但您永远不会看到它,而且它可能只会在寄存器中。我想这就是你要问的。