Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这两个类的大小相同,这个方法对一个类来说没有大小吗?_C++ - Fatal编程技术网

C++ 为什么这两个类的大小相同,这个方法对一个类来说没有大小吗?

C++ 为什么这两个类的大小相同,这个方法对一个类来说没有大小吗?,c++,C++,我正在检查班级的规模。此外,我是新的C++。我有两门课, 两个类之间的区别在于其中一个类有8个方法。为什么这两个班级的人数没有差别呢。你能给我解释一下这些概念吗 #include <iostream> using namespace std; class A { int b; char c[2]; int func(int x, int y) { return x+y; } int func1(int x, i

我正在检查班级的规模。此外,我是新的C++。我有两门课, 两个类之间的区别在于其中一个类有8个方法。为什么这两个班级的人数没有差别呢。你能给我解释一下这些概念吗

#include <iostream>

using namespace std;

class A
{

    int b;
    char c[2];

    int func(int x, int y)
    {
       return x+y;  
    }
    int func1(int x, int y)
    {
       return x+y;  
    }
    int func2(int x, int y)
    {
       return x+y;  
    }
    int func3(int x, int y)
    {
       return x+y;  
    }
    int func4(int x, int y)
    {
       return x+y;  
    }
    int func5(int x, int y)
    {
       return x+y;  
    }    
    int func6(int x, int y)
    {
       return x+y;  
    }
    int func7(int x, int y)
    {
       return x+y;  
    }
};

class B
{

    int b;
    char c[2];
};


int main()
{
     cout<<"Size of class A is "<< sizeof(A)<<endl;
     cout<<"Size of class B is "<< sizeof(B)<<endl;

    return 0;
}
sizeof()
度量实例的大小,而不是类本身。类方法的程序代码不与
int b
char c[2]
一起存储;如果有数百个实例和数百份函数代码副本,这将是一个巨大的内存浪费

因此,类的每个实例只存储成员变量(对于虚函数,还存储
vtbl
指针)。函数代码在每个类中只存储一次,不影响实例大小。

sizeof()
度量实例的大小,而不是类本身。类方法的程序代码不与
int b
char c[2]
一起存储;如果有数百个实例和数百份函数代码副本,这将是一个巨大的内存浪费


因此,类的每个实例只存储成员变量(对于虚函数,还存储
vtbl
指针)。每个类只存储一次函数代码,不影响实例大小。

准确地说。方法不会影响对象的大小。每个函数只有一个副本,作为隐藏参数传递


添加第一个虚拟函数时,您会注意到大小增加,因为具有虚拟函数的对象至少需要一个额外的指针来动态解析虚拟调用。

正是如此。方法不会影响对象的大小。每个函数只有一个副本,作为隐藏参数传递


添加第一个虚拟函数时,您会注意到大小增加,因为具有虚拟函数的对象至少需要一个额外的指针来动态解析虚拟调用。

通常,程序在内存中被划分为多个段,堆栈和堆包含类和变量的实例,代码段包含与方法和函数相关的指令。类中指令占用的空间不会根据实例的数量而增加

sizeof操作符度量类实例的大小。此实例要么放在堆栈上,要么放在堆上,这取决于您是否动态为其分配内存


如果将成员变量创建为静态变量,则它将成为类变量,而不是sizeof的一部分。(放在程序的数据段中)

通常,程序在内存中被分成多个段,堆栈和堆包含类和变量的实例,代码段包含与方法和函数相关的指令。类中指令占用的空间不会根据实例的数量而增加

sizeof操作符度量类实例的大小。此实例要么放在堆栈上,要么放在堆上,这取决于您是否动态为其分配内存


如果将成员变量创建为静态变量,则它将成为类变量,而不是sizeof的一部分。(放在程序的数据段中)

为什么会这样?如果你制作了一百万个对象,你就不需要800万个不必要的函数副本了。为什么会这样呢?如果你制作了一百万个对象,你就不需要800万个不必要的函数副本了。更多关于这方面的阅读:+1提及虚拟方法。更多关于这方面的阅读,请点击此处:
$ ./class_size.out 
Size of class A is 8
Size of class B is 8