例如: Sizeof (char*)返回4。还有int* long long*,我试过的所有方法。有什么例外吗?
当前回答
在windows 32位机器上的Turbo C编译器中,指针和int的大小为2字节。
所以指针的大小是编译器特定的。但一般大多数编译器实现为支持32位4字节指针变量和64位8字节指针变量)。
所以指针的大小在所有机器上都是不一样的。
其他回答
从技术上讲,C标准只保证sizeof(char) == 1,其余的取决于实现。但在现代x86架构(例如Intel/AMD芯片)上,这是相当可预测的。
You've probably heard processors described as being 16-bit, 32-bit, 64-bit, etc. This usually means that the processor uses N-bits for integers. Since pointers store memory addresses, and memory addresses are integers, this effectively tells you how many bits are going to be used for pointers. sizeof is usually measured in bytes, so code compiled for 32-bit processors will report the size of pointers to be 4 (32 bits / 8 bits per byte), and code for 64-bit processors will report the size of pointers to be 8 (64 bits / 8 bits per byte). This is where the limitation of 4GB of RAM for 32-bit processors comes from -- if each memory address corresponds to a byte, to address more memory you need integers larger than 32-bits.
即使是在普通的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在这里讲过。
除了16位/32位/64位的差异之外,还会发生更奇怪的事情。
曾经有一些机器sizeof(int *)是一个值,可能是4,但sizeof(char *)更大。自然地处理单词而不是字节的机器必须“增加”字符指针,以指定您真正想要的单词的哪一部分,以便正确地实现C/ c++标准。
现在这是非常不寻常的,因为硬件设计师已经了解了字节可寻址性的价值。
出于完整性和历史兴趣,在64位世界中,对于长类型和长类型的大小有不同的平台约定,分别命名为LLP64和LP64,主要在unix类型系统和Windows之间。一个名为ILP64的旧标准也使int = 64位宽。
微软保留了LLP64,其中longlong = 64位宽,但long保留为32位宽,以便于移植。
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
来源:https://stackoverflow.com/a/384672/48026
除了人们所说的64位(或其他)系统,还有其他类型的指针,而不是指向对象的指针。
指向成员的指针几乎可以是任何大小,这取决于编译器如何实现它们:它们甚至不一定都是相同的大小。尝试一个POD类的指向成员的指针,然后尝试一个继承自具有多个基类的基类之一的指向成员的指针。什么乐趣。