c++ - C++中成员函数的内存分配

标签 c++

#include<iostream>
using namespace std;
class A
{

};
class B
{
        public:
                void disp()
                {
                        cout<<" This is not virtual function.";
                }
};
class C
{
        public:
                virtual void disp()
                {
                        cout<<"This is virtual function.";
                }
};
int main()
{
        cout<<"class A"<<sizeof(A)<<endl;
        cout<<"class B"<<sizeof(B)<<endl;
        cout<<"class C"<<sizeof(C)<<endl;
        return 0;
}

A类和B类的sizeof都只有1字节,那么B中的成员函数disp的内存分配呢。

最佳答案

对于类的每个实例,内存只分配给它的成员变量,即类的每个实例都没有得到它自己的成员函数拷贝。所有实例共享相同的成员函数代码。您可以将其想象为编译器为每个成员函数传递一个隐藏的 this 指针,以便它对正确的对象进行操作。在您的情况下,由于 C++ 标准明确禁止大小为 0 的对象,因此 A 类和 B 类的最小可能大小为 1。对于 C 类,因为存在虚函数,所以 C 类的每个实例都有一个指向其 v 的指针-table(虽然这是特定于编译器的)。所以这个类的 sizeof 将是 sizeof(pointer)。

关于c++ - C++中成员函数的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888069/

相关文章:

c++ - 连接 OpenCV Mat 和单个值

c++ - s[i]^=32 是如何将大写转换为小写的?

c++ - Objective-C 枚举错误?

c++ - 如何从 LPCTSTR 转换为 std::string?

c++ - SDL_混音器 : crash Mix_FreeMusic();

c# - Dispatcher.Invoke 从多个线程调用的代码中出现死锁

c++ - 从字符串流复制到 char * 数组返回作为函数参数

c++ - 生命游戏 - 算法问题 C++

c++ - 使用带有字符串定界符的 boost::tokenizer

c++ - 您将如何为对象产生滚动效果?