c – 带有’this’指针的类的大小

c – 带有’this’指针的类的大小,第1张

概述没有数据成员的类的大小返回为1个字节,即使声明了一个隐式的“this”指针.返回的大小不应该是4个字节(在32位机器上)?我遇到了一些文章,表明’this’指针不计算用于计算对象的大小.但我无法理解这个原因. 此外,如果任何成员函数声明为virtual,则类的大小现在返回为4个字节.这意味着计算vptr以计算对象的大小.为什么在计算对象大小时会考虑vptr并忽略’this’指针? this指针不是 没有数据成员的类的大小返回为1个字节,即使声明了一个隐式的“this”指针.返回的大小不应该是4个字节(在32位机器上)?我遇到了一些文章,表明’this’指针不计算用于计算对象的大小.但我无法理解这个原因.
此外,如果任何成员函数声明为virtual,则类的大小现在返回为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;}

如果上面是在类中定义的(因此它可以访问私有成员),那就没有区别了.实际上,这就是在场景后面实现方法的方法; this指针只是所有成员方法的隐藏参数.

电话会变成:

IntPair* fib12 = new IntPair(89,144);cout << IntPair::sum2(fib12);
总结

以上是内存溢出为你收集整理的c – 带有’this’指针的类的大小全部内容,希望文章能够帮你解决c – 带有’this’指针的类的大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存