c++ - 具有 'this' 指针的类的大小

标签 c++ sizeof

没有数据成员的类的大小返回为 1 个字节,即使声明了隐式“this”指针也是如此。返回的大小不应该是 4 个字节(在 32 位机器上)吗?我看到一些文章指出“this”指针不计入计算对象的大小。但是我无法理解其中的原因。 此外,如果任何成员函数被声明为虚拟的,则类的大小现在返回为 4 个字节。这意味着 vptr 被计算用于计算对象的大小。为什么在计算对象大小时考虑 vptr 而忽略“this”指针?

最佳答案

this 指针不是类的成员。它只是一个构造,用于属于该类的方法中以引用当前实例。

如果你有这样的类:

class IntPair
{
public:
  IntPair(int a, int b) : _a(a), _b(b) { }

  int sum() const { return _a + _b; }

public:
  int _a;
  int _b;
};

对于每个实例,此类仅需要两个 int 实例的空间。一旦您创建了一个实例并运行了 sum() 方法,该方法将被调用并带有指向该实例的指针,但该指针总是来自其他地方,它不会存储在对象实例。

例如:

IntPair *fib12 = new IntPair(89, 144);

cout << fib12->sum();

注意成为 this 指针的变量是如何存储在对象外部的,在创建它的范围内。

事实上,您总是可以将上述方法转换为:

static int sum2(const IntPair* instance)
{
  return instance->_a + instance->_b;
}

如果上面是在类内部定义的(这样它就可以访问私有(private)成员),则没有区别。事实上,这方法是如何在幕后实现的; this 指针只是所有成员方法的隐藏参数。

调用会变成:

IntPair* fib12 = new IntPair(89, 144);

cout << IntPair::sum2(fib12);

关于c++ - 具有 'this' 指针的类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2468152/

相关文章:

c++ - C++ 中的类成员隐私和 header

c++ - 对齐具有 vector 作为成员的结构 (c++)

c - sizeof 与字符串的行为

hibernate - EHCache SizeOf 警告

c++ - Qt : Software using QOpenGLWidget crash on mainwindow. 显示()

c++ - 如何在 OS X 上安装 C++ 库 libuv?

c - 解释包含结构的 union 的 sizeof 运算符的结果

c++ - 是否可以保证包含数组的类的大小?

c++ - 如何使用 Box2d 获取一个或多个碰撞点?

c++ - 给定一个使用 gcc 从 C++ 构建的 ELF 二进制文件,我如何确定其中某些类型的大小?