当我尝试制作对象时,跳过8个字节
8 bytes skipped while I try to make objects?
#include <iostream>
using namespace std;
class V3 {
public:
double x, y, z;
V3(double a, double b, double c) {
x=a;
y=b;
z=c;
cout << "Addresses are " << &x << " " << &y << " " << &z << endl;
}
};
int main() {
V3 a(1,1,1), b(2,2,2), c(3,3,3), d(4,4,4);
cout << sizeof(a) << " " << sizeof(b) << " " << sizeof(c) << " " << sizeof(d) << endl;
}
在上面提到的代码中,我试图了解c++如何在内存中存储对象。在运行此代码时,我得到以下输出-
Addresses are 0x7ffc5996b160 0x7ffc5996b168 0x7ffc5996b170
Addresses are 0x7ffc5996b180 0x7ffc5996b188 0x7ffc5996b190
Addresses are 0x7ffc5996b1a0 0x7ffc5996b1a8 0x7ffc5996b1b0
Addresses are 0x7ffc5996b1c0 0x7ffc5996b1c8 0x7ffc5996b1d0
24 24 24 24
所以对于对象b
,我想知道为什么我没有得到0x7ffc5996b178
作为我的地址。为什么c++在开始下一个对象之前跳过8个字节?
将各种评论转换为Community Wiki答案
-
分配是否必要?如果你使用
V3(double a, double b, double c) : x(a), y(b), z(c) { cout << …; }
,有什么变化吗?(我不认为会有什么不同。)您是否尝试打印main()
中类对象的地址?这能说明什么问题吗?最终,虽然,你的问题是徒劳的-编译器被允许使用任何布局和对齐它选择只要它给出正确的结果。 -
只是猜测:x86缓存行是64字节。通过这种方式对齐,前两个对象将适合于一条缓存线,第三个对象将适合于第二条缓存线。如果它们不是这样对齐的,那么第三个对象将被分割成2条缓存线,这很糟糕。正如已经说过的,它不一定定义良好。
-
如果在arch上使用
clang
编译,对象在内存中是密集的,当使用g++
编译时,它们不是。
相关文章:
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- (Arduino)我可以跳过parseInt()中的多个字符吗
- C++:跳过第一个用户输入提示
- C++ : 如何在使用 getline() 和 ifstream 对象从文件中读取一行时跳过第一个空格?
- 跳过每三个数字
- 如何在我的代码中修复无穷循环?我认为它跳过了第二个CIN,因此它一直在循环
- 两个构造函数(带和不带参数),没有输入 -> 没有参数运行。跳过上述类中的构造函数
- QT Qtimeline跳过了第一个框架
- 为什么我的程序跳过第一个函数?(初学者C++)
- 使用cin.ignore()跳过两个空间
- 使用Cublas SGEMV时,如何跳过Float4中的第四个元素
- 正在跳过字符串数组中的第一个字符串
- 为什么boost::python迭代器跳过第一个元素
- 程序跳过第二个 cin
- C++问题 - 获取线跳过第一个输入
- 读取几个字节,跳过 N 个字节,然后再次读取几个字节.如何
- fstream跳过第一个字符
- C++ strtok 跳过第二个标记或连续分隔符
- 它跳过第二个getline()函数
- 当我尝试制作对象时,跳过8个字节