什么决定对象大小?

时间:2015-03-04 01:03:37

标签: c++ sizeof

我创建了包含整数和几个方法的简单对象,仅使用整数原始变量并比较它们的大小。 "的sizeof()"对于" 4"的返回值。为什么 - 不应该是复合类型的对象,并且包含有关方法的信息需要更多空间?

#include <iostream>

class Person{

    private:
        int a;

    public:

        void hello(){
            std::cout << "hello";
        }

        void DoSomething(){
            a++;
        }
};

int main(){

    int a;
    Person p;

    std::cout << sizeof(a) << std::endl;

    std::cout << sizeof(p) << std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:10)

这些方法(技术上是C ++术语中的成员函数)对&#34; size&#34;没有贡献。一个对象。如果你考虑一下,这是有道理的。成员函数适用于从类或其后代实例化的任何对象,并且在某种意义上独立于实例。您可以将某个虚构类Foo的成员函数视为声明为

的独立函数
return_type some_member_function(Foo* ptr, /* other params */){...}

其中第一个参数是指向要应用函数的实例的指针。编译器实际上在调用成员函数时隐式传递指针ptr,所以

foo.some_member_function(/* other params */)

正在内部翻译为

some_member_function(&foo, /* other params */)

您可以通过关键字ptr在实际C ++代码中使用this指向的当前实例的地址。技术上the keyword this is a prvalue expression whose value is the address of the object, on which the member function is being called.


PS:正如注释中提到的@greyfade一样,对象的大小可能仅仅通过virtual成员函数的声明来增加,因为在这种情况下编译器必须在内部存储指向所谓的&#34;虚拟表&#34;。无论虚拟功能是否被覆盖,都是这种情况。因此,如果您关心对象大小,不要盲目地将析构函数设置为虚拟,除非您打算将您的类用作层次结构中的基础。