我想知道一个空类的对象的大小.它肯定不能是0字节,因为它应该可以像任何其他对象一样引用和指向它.但是,这样的对象有多大?
我用过这个小程序:
#include <iostream>
using namespace std;
class Empty {};
int main()
{
Empty e;
cerr << sizeof(e) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Visual C++和Cygwin-g ++编译器上得到的输出是1个字节!这对我来说有点令人惊讶,因为我期望它的机器字大小(32位或4字节).
任何人都可以解释为什么 1字节的大小?为什么不是 4个字节?这是依赖于编译器还是机器?此外,有人可以给出一个更有说服力的理由,说明为什么空类对象的大小不是 0字节?
可能重复:
C++中的空类C
中空结构的大小是多少?
我在某处看到C++中空结构的大小为1.所以我想到验证它.不幸的是我把它保存为C文件并使用了<stdio.h>标题,我很惊讶地看到了输出.这是0.
这意味着
struct Empty {
};
int main(void)
{
printf("%d",(int)sizeof(Empty));
}
Run Code Online (Sandbox Code Playgroud)
在编译为C文件时打印0,在编译为C++文件时打印1.我想知道原因.我读到c ++中的sizeof空结构不为零,因为如果大小为0,则该类的两个对象将具有相同的地址,这是不可能的.我哪里错了?
据对我来说,它是零,但似乎有一点混乱这里
我用gcc编译器对它进行了测试,它给出了零作为输出.我知道在C++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我.
struct X {};
struct D : X {
X x;
};
Run Code Online (Sandbox Code Playgroud)
根据http://www.stroustrup.com/bs_faq2.html#sizeof-empty,空基类将大小添加为零.
考虑以下示例:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
Run Code Online (Sandbox Code Playgroud)
生成的汇编代码vector::empty(通过 clang,经过优化):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
Run Code Online (Sandbox Code Playgroud)
为什么要分配堆栈空间?它根本没有被使用。该push和pop可以省略。MSVC 和 gcc 的优化构建也为此功能使用堆栈空间(请参阅有关Godbolt 的内容),因此必须有一个原因。
我猜不是,但这样的输出表明它确实如此
string s="";
cout<<&s;
Run Code Online (Sandbox Code Playgroud)
拥有地址的空字符串有什么意义?你认为不应该花费任何记忆吗?
没有数据成员的类的大小返回为1个字节,即使声明了隐含的"this"指针.返回的大小不应该是4个字节(在32位机器上)?我遇到过一些文章,表明"this"指针不计算用于计算对象的大小.但我无法理解这个原因.此外,如果任何成员函数声明为virtual,则类的大小现在返回为4个字节.这意味着计算vptr以计算对象的大小.为什么在计算对象大小时会考虑vptr并忽略'this'指针?
我有一个模板,它采用具有不同值的结构,例如:
struct Something
{
char str[10];
int value;
...
...
};
Run Code Online (Sandbox Code Playgroud)
在函数内部我使用sizeof运算符:跳入内存 sizeof(Something);
有时我想不跳任何东西; 我希望sizeof返回零.如果我输入一个空结构,它将返回1; 我可以在模板中放置什么来使sizeof返回零?
请考虑以下代码:
#...
class A {};
class B: public A{};
class C: virtual public A{};
class D: virtual public C{};
// No More Classes
...
int _tmain(int argc, _TCHAR* argv[]) {
cout<<sizeof(A)<<" ";
cout<<sizeof(B)<<" ";
cout<<sizeof(C)<<" ";
cout<<sizeof(D)<<".";
...
}
Run Code Online (Sandbox Code Playgroud)
O/P:1 1 4 8.
题:
*.这是我的第一个问题,如果你发现任何错误,请纠正我.
可能重复:
C++中的空类
class Class1
{
char c;
};
class Class2
{
};
Run Code Online (Sandbox Code Playgroud)
Class1和Class2的大小是多少?
在VC6中,我得到了两个1.有人可以解释一下吗?
我知道空类的大小由标准定义为非零.在大多数实现中,它通常是 1个字节.
但是,C++标准是否指定了对象的最小可能大小?假设按照标准,空类对象的大小至少为 1个字节,这是合乎逻辑的.