可能重复:
C++:空类对象的大小是多少?
为什么以下输出1?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我发现MSVC和GCC编译器每个类实例至少分配一个字节,即使该类是没有成员变量的谓词(或只有静态成员变量).以下代码说明了这一点.
#include <iostream>
class A
{
public:
bool operator()(int x) const
{
return x>0;
}
};
class B
{
public:
static int v;
static bool check(int x)
{
return x>0;
}
};
int B::v = 0;
void test()
{
A a;
B b;
std::cout << "sizeof(A)=" << sizeof(A) << "\n"
<< "sizeof(a)=" << sizeof(a) << "\n"
<< "sizeof(B)=" << sizeof(B) << "\n"
<< "sizeof(b)=" << sizeof(b) << "\n";
}
int main()
{
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(A)=1
sizeof(a)=1
sizeof(B)=1 …Run Code Online (Sandbox Code Playgroud) 什么是std::pair,为什么我会使用它,以及boost::compressed_pair带来什么好处?
我们都知道空类的大小或空类的对象将是1个字节.我遇到了sizeof一个类及其对象变为0的东西.该程序在语法上是正确的,因为没有编译或运行时错误.这是未定义的行为吗?我试图执行的用例有意义,看起来像一个有效的用例?不给类中的数组提供精确的下标或大小是一个很大的错误吗?代码段如下:
#include<iostream>
using namespace std;
class A
{
char a[];
};
int main()
{
A b;
cout<<sizeof(A)<<endl;
cout<<sizeof(b)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
在sizeof一个空类是一个字节(非零基本)和其中的原因是说,像"为了确保不同的对象有不同的地址."
在这种情况下会发生什么sizeof呢?当班级来零时?注意:也观察到相同的行为int a[].
C++和Java中空类的大小是多少?为什么不是零?
sizeof();在C++的情况下返回1.
我有一个没有成员的结构(目前),我想知道是否有可能抑制我得到的警告:
warning: struct has no members
Run Code Online (Sandbox Code Playgroud)
是否可以添加成员并保持sizeof结构为零?还有其他方法吗?
这是打印不同类的大小的代码
#include <iostream>
using namespace std;
class EmptyClass
{
};
class AbstractClass
{
public:
virtual void funcOne() = 0;
virtual void funcTwo() = 0;
};
class NotAbstrClass
{
public: int virtFunc( int );
};
class MixClass
{
public:
virtual void clFunc( int );
static int i;
int j;
};
int main()
{
// Print size of class or class objects
cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;
cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
cout<<"Size …Run Code Online (Sandbox Code Playgroud) 以下代码来自"Inside the C++ object model"一书
#include <iostream>
using namespace std;
class X{};
class Y: public virtual X{};
class Z: public virtual X{};
class A: public Y, public Z{};
int main()
{
cout<<sizeof(X)<<" "<<sizeof(Y)<<" "<<sizeof(Z)<<" "<<sizeof(A)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的电脑(Windows,VS2010)中,输出为:
1 4 4 8
这是我的问题
1,sizeof(X)= 1
该书说当X类型生成两个实例时,比如说xa和xb.编译在A中插入一个字节,以便xa和xb可以有不同的地址.我不太明白原因.
2,sizeof(Y)= 4
通过使用虚拟继承,我们还有一个额外的虚拟指针吗?我想这可能与多态中的虚拟指针不同.任何人都可以给我Y的内存布局吗?
谢谢!
没有数据成员的类的大小返回为1个字节,即使声明了隐含的"this"指针.返回的大小不应该是4个字节(在32位机器上)?我遇到过一些文章,表明"this"指针不计算用于计算对象的大小.但我无法理解这个原因.此外,如果任何成员函数声明为virtual,则类的大小现在返回为4个字节.这意味着计算vptr以计算对象的大小.为什么在计算对象大小时会考虑vptr并忽略'this'指针?
随着代码:
#include <iostream>
class A {};
class B { char x; };
int main()
{
std::cerr << sizeof(A) << " " << sizeof(B) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我知道要问一个空课的大小是一个常见的面试问题 - 我知道答案是一个.
我的问题是......在一个空类的"1"字节中保存了什么(我猜它是空的),编译器在内部做了什么来使它sizeof B与sizeof A这种情况相同?
我想完全理解它,而不仅仅是知道答案.