- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力理解主程序中声明的变量与实例化类对象中的变量之间内存寻址差异的概念!
我的问题是,当我在主程序中声明两个变量(例如“int a, int b”)时,它需要 4+4 个字节,并且在内存中的某个位置有一个特定的两个地址。示例“a 在内存 0x248444 中,b 在 0x248448 中”……在这种情况下没问题……
当涉及到具有两个变量“int c,int d”的类实例化对象时,该对象采用8字节的内存地址,例如“0x248544”,那么“int c和int d”的地址呢?
所以 int c 和 int d 的地址在对象地址“0x248544”内?int c 和 int d 是否有特定地址?
如何理解/实例化类对象地址和该对象内部变量地址有什么区别?
希望我的问题很清楚....
在互联网上搜索后,我找到了一本名为“inside the C++ object model”的书,但对于实例化类对象中声明的变量和main中声明的变量的内存差异有基本的了解。有人请帮我说清楚。
提前致谢。
最佳答案
好的,你有一个像这样的 C 类:
class C
{
int c;
int d;
};
类 C (C c
) 的实例将占用一些内存,它需要(假设 int 是 4 个字节大——虽然这不一定在所有机器上都是如此)8 个字节。
如果实例位于地址 0x248544,它将恰好占据该地址的字节 + 下一个后续字节。在上面这样一个没有任何进一步条件的简单类中,c 将占据这八个字节的前四个,d 将占据接下来的四个。
因此 c.c
与您的对象 c
具有完全相同的地址,而 c.d
位于四个字节之后,因此地址为 0x248548。
但是请注意,第一个成员不一定与您的对象具有相同的地址!让我们修改我们的 C 类:
class C
{
virtual ~C() { } // virtual destructor -> C gets virtual!
int c;
int d;
};
现在,sizeof(C) 将为 16(!)(前提是指针需要 8 字节存储空间,就像在现代 64 位硬件上一样)。为什么?该类获得一个指向 vtable 的附加指针,该指针通常是类 C 的第一个(但不可见)成员。
因此 c
仍将位于地址 0x248544,但现在指向 vtable 的(不可见)指针共享该地址; c.c
在后面,因此位于地址0x2484c,c.d
则位于0x24850。
在这方面,C++ 不同于 C,其中结构的第一个成员总是共享结构本身的地址...
虽然在 C 和 C++ 中,两个后续成员不一定必须相互“接触”,它们之间可能会填充一些字节 - 关键字字节对齐。
此外,C++ 允许对类的成员重新排序:而在 C 中,如果结构成员 a
在 b
之前声明,则 a
必须放在 b
之前在内存中也是如此,这在 C++ 中只有具有相同可访问性的成员才需要!
class C
{
int a;
public:
int b;
private:
int c;
};
现在允许编译器保持顺序不变,但它也可以将 b
放在其他两个之前或之后 - 只有 a
不允许这样做放在 c
之后。
长话短说:所有这些内存布局的东西比您可能预期的要复杂得多...
vtables 旁注:vtable 指针不需要存在(相对于 C++ 标准)- 如果任何编译器供应商找到更好的解决方案来实现多态性,他们可以自由地这样做 - if 他们发现...但是 vtables 是当前最先进的技术,一种事实上的标准。
关于c++ - C++中 "Class instantiated object and variable inside the object address"的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520196/
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
有谁知道区别吗? 最佳答案 如果您想玩可移植的可执行文件,就没有办法绕过 the specs 的副本。 . 已经有一段时间了,但如果内存正确地为我服务:IT 和 IAT 是相同的,除了 IAT 在解析
我正在尝试在 ec2-instance 上安装 Hadoop-2.6.0。 我下载并安装了 Hadoop。我还设置了环境变量。尝试启动 hdfs 服务时出现以下错误。 [ec2-user@ip-10-
我写了一个示例程序。如果我打印 pa 和 pb 的地址都是不同的。你能告诉我为什么会这样吗? #include using namespace std; class A { int x; }; cla
*&x 是否总是等于 x?如果不是,什么时候不是? &*x 是否总是等于 x?如果不是,什么时候不是? 我的猜测是 (1) 总是正确的,但 (2) 并不总是正确的,因为 x 可能并不总是一个指针,所以
我有一个 Address 类,它是一个非常简单的元数据容器。 (在底部。) 我有一个 Address 对象数组,它不是可选的 - 它肯定存在。我还有一个类维护这些引用的可选列表,如下所示: publi
我在理解 wsdl 中 soap:address 和 http:address 标签之间的区别时遇到了一些问题。它可以互换吗?我可以使用 soap:address 代替 http:address 吗?
关于AT (...) ld 的指令, this source状态: AT ( ldadr ) The expression ldadr that follows the AT keyword spec
我正在使用 Tensorflow 的 C API 在并行模拟中进行推理。因为我想要 AVX 支持,所以我从源代码编译了 Tensorflow。我链接它并使用 wmake 编译所有内容。 现在,如果我开
就像标题一样,我是cxf的新手。只是想知道 soap:address 和发布时在应用程序上下文中的 jaxws:endpoint 中指定的地址有什么区别? 此外,在jaxws:endpoint中,地址
#include #include using namespace std; class myexception: public exception { virtual const char*
C/C++ 应用程序抛出该错误,如何开始调试(比添加打印语句更好的主意)? 最佳答案 第二个地址是不是一个非常小的数字,比如 0x00000001 或 0x00000000?如果是这样,您可能只是忘记
如果我没记错的话,几天前它曾经显示“localhost”。我不确定是什么改变了 server.address().address 返回双冒号 (::) 。我在这里读到,如果它可用,它会返回一个 IPv
我现在正在使用 MPI 练习简单的并行编程。该代码旨在通过随机生成 N*N 矩阵并使用简单的邻域加权平均滤波器来模拟图像处理,而不处理第一行和最后一行和列。我在编译时没有出错,但在运行时出现了一些我无
这个问题在这里已经有了答案: How to retrieve range.address which is longer than 255 character? (2 个回答) 5年前关闭。 觉得很奇
当我尝试启动 Apache2 时收到以下消息: * Restarting web server apache2
我正在阅读一些有关指针和结构的内容,但我就是不明白:微 Controller 的头文件中有这样的内容: #define NVIC_BASE (SCS_BASE + 0x0100) /*ICER[0]
我有 alertmanager 作为 docker 容器在两台不同的主机上运行,并且两者都应该作为集群运行。两台机器都在同一个 vpc 内,并与私有(private) IP 地址通信。 我需要知道
在 Organization schema两者都有属性 address和 location . 什么时候应该使用每一个的真实世界例子? 地点 事件、组织或行动的地点。 地址 项目的物理地址。 最佳答案
我想要具有 FIFO 的服务器-客户端模型和客户端获取目录路径,但我收到错误“读:错误地址”和“写:错误地址”。 客户端 服务器错误:“读取:地址错误” 客户端错误:“写入:地址错误” 最佳答案 您可
我是一名优秀的程序员,十分优秀!