正如许多学生试图学习c ++的情况一样,我对指针,特别是指向对象的指针有点困惑。
一个简单的指针,如
int *x = new int(5);
很容易理解,因为x只存储了存储int 5的单词的地址。
但是,如果我们有像
这样的东西呢 MyClass *x = new MyClass();
在这种情况下,x不能指向包含MyClass实例的单词,因为它可能比单词大。
所以问题是对象指针在内存中实际指向了什么?
答案 0 :(得分:2)
对于对象,就像数组一样,它指向数据结构中包含的第一个元素。指针只能指向内存中的一个地址。它们不存储比此值更多的信息。是什么让它们看起来像你可以指向更大的类型只是编译工作。实际上,它甚至代表内存中需要4个字节的整数。 int指针只指向所述数据结构的第一个字节,编译器将根据sizeof(T)
运算符的结果在需要时负责加载适量的内存。
例如,sizeof(int)
返回4,这是存储整个int值所需的内存中的字节数。如果您创建一个指向int的指针,它将使用32或64位长的地址引用这4个字节中的第一个,具体取决于您的目标处理器(x86架构)。如果对象MyClass包含3个整数和1个双精度,则sizeof(MyClass)
运算符将返回20 (3 * 4 + 8)
。同样,指向MyClass的指针只会指向使用32位或64位地址的第一个字节。
整个CPU架构中指针的大小保持不变。如果你的CPU可以分配8位内存,你的指针将是一个字节长。换句话说,sizeof(T*) == sizeof(unsigned char)
。在x86_64目标体系结构上,指针的大小为64位,因此为sizeof(T*) == sizeof(long long)
。
答案 1 :(得分:1)
MyClass *x = new MyClass();
在这种情况下,x将存储长度为sizeof(MyClass)
的内存块的地址。
另一种用途:
Myclass *y = new (0x11111122) MyClass();
在这种情况下,y将存储0x11111122,这是一个已初始化新MyClass实例的地址(此示例很可能会使您的应用程序崩溃,因为您可能会破坏此地址内存中的任何内容)。
答案 2 :(得分:0)
如果您要更改此短语中的一个单词
x只存储存储int 5
的单词的地址
然后我希望它会很清楚
x只存储存储int 5或MyClass()的内存的地址;
Operator new使用sizeof( int )
或sizeof( MyClass )
的值来分配足够的内存。例如,sizeof(long long)通常大于mashine单词的sizeof。
此外,即使对于整数,这些大小例如等于4个字节,编译器实际上可以分配16个字节而不是4个字节。实现定义了将分配多少内存。考虑到您可能会重载分配内存的新函数。
考虑C ++标准中的以下引用
6除非对象是位字段或基类子对象为零 size,该对象的地址是它的第一个字节的地址 占据。