例如:
sizeof(char*)
返回4一样int*
,long long*
,我已经竭尽所能.这有什么例外吗?
你得到的保证就是这样sizeof(char) == 1
.没有其他保证,包括不保证sizeof(int *) == sizeof(double *)
.
实际上,指针在16位系统上的大小为2(如果你能找到一个),在32位系统上是4,在64位系统上是8,但是依靠给定的东西没有任何好处.尺寸.
即使在普通的x86 32位平台上,您也可以获得各种指针大小,试试这个例子:
struct A {}; struct B : virtual public A {}; struct C {}; struct D : public A, public C {}; int main() { cout << "A:" << sizeof(void (A::*)()) << endl; cout << "B:" << sizeof(void (B::*)()) << endl; cout << "D:" << sizeof(void (D::*)()) << endl; }
在Visual C++ 2008下,我得到了指向成员函数的指针大小的4,12和8.
Raymond Chen 在这里谈到了这一点.
只是已发布列表的另一个例外.在32位平台上,指针可以占用6 个字节,而不是4个字节:
#include#include int main() { char far* ptr; // note that this is a far pointer printf( "%d\n", sizeof( ptr)); return EXIT_SUCCESS; }
如果你使用Open Watcom编译这个程序并运行它,你将得到6,因为它支持的远指针包括32位偏移和16位段值
如果你正在为64位机器编译,那么它可能是8.
从技术上讲,C标准只保证sizeof(char)== 1,其余的由实现决定.但在现代x86架构(例如Intel/AMD芯片)上,它是相当可预测的.
您可能听说过处理器被描述为16位,32位,64位等.这通常意味着处理器使用N位作为整数.由于指针存储内存地址,而内存地址是整数,因此这有效地告诉您将使用多少位作为指针.sizeof通常以字节为单位,因此为32位处理器编译的代码将报告指针大小为4(每位32位/ 8位),64位处理器的代码将报告指针大小为8 (每字节64位/ 8位).这就是32位处理器4GB RAM的限制来自 - 如果每个存储器地址对应一个字节,为了满足更多存储器需要大于32位的整数.
除了16/32/64位差异之外,甚至可能发生更奇怪的事情.
有一些机器,其中sizeof(int*)将是一个值,可能是4,但sizeof(char*)更大.自然地处理单词而不是字节的机器必须"扩充"字符指针,以指定您真正想要的单词部分,以便正确实现C/C++标准.
现在这非常不寻常,因为硬件设计人员已经学会了字节寻址能力的价值.
指针的大小基本上取决于实现它的系统的体系结构.例如,32位指针的大小在64位机器中是4字节(32位)和8字节(64位).机器中的位类型只是它可以拥有的内存地址.32位机器可以有2^32
地址空间,64位机器可以有最多2^64
地址空间.因此,指针(指向内存位置的变量)应该能够指向2^32 for 32 bit and 2^64 for 64 bit
机器所拥有的任何内存地址().
由于这个原因,我们看到指针的大小在32位机器中是4个字节,在64位机器中是8个字节.
在大多数低调微控制器中使用8位和16位指针.这意味着每台洗衣机,微型冰箱,冰箱,旧电视,甚至汽车.
你可以说这些与现实世界的编程无关.但这里有一个真实世界的例子:Arduino,1-2-4k ram(取决于芯片),带有2个字节的指针.
它最近,价格便宜,适合所有人,值得编码.