c++ - 什么决定了这里的对象大小?

标签 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;
}

最佳答案

方法(C++ 术语中的技术成员函数)不会影响对象的“大小”。如果你考虑一下,这是有道理的。成员函数适用于从类或其后代实例化的任何对象,并且在某种意义上独立于实例。您可以将某些虚构类 Foo 的成员函数视为声明为

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

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

foo.some_member_function(/* other params */)

内部翻译为

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

您可以通过关键字this在实际的C++代码中使用ptr指向的当前实例的地址。技术上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 成员函数的简单声明来增加,因为在这种情况下,编译器必须在内部存储一个指向所谓的“虚拟表”的指针。无论虚函数是否被覆盖都是如此。因此,如果您关心对象大小,请不要盲目地将析构函数设为虚拟,除非您打算将您的类用作层次结构中的基类。

关于c++ - 什么决定了这里的对象大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844975/

相关文章:

c++ - std::this_thread::yield() 与 std::this_thread::sleep_for()

Android - 将 C++ 套接字服务器移植到 Android?

c++ - 如何按列复制 vector ?

c++ - 丢弃视频帧

c - 如何获取 const char 指针的大小

c - (2*3.14f) 的类型是什么?

c++ - 获取类中静态属性的个数

c++ - 链接到我的主目录中的共享对象文件

c - 如维基百科上的某些 C 代码所示,是否在 printf 格式字符串中使用了 %zu 正确的语法?

c - 结构具有 union 时的意外大小