相关疑难解决方法(0)

C++:空类对象的大小是多少?

我想知道一个空类的对象大小.它肯定不能是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++ class object

105
推荐指数
5
解决办法
6万
查看次数

sizeof空结构在C中为0,在C++中为1为什么?

可能重复:
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,则该类的两个对象将具有相同的地址,这是不可能的.我哪里错了?

c c++ struct sizeof

33
推荐指数
3
解决办法
2万
查看次数

C中空结构的大小是多少?

据对我来说,它是零,但似乎有一点混乱这里

我用gcc编译器对它进行了测试,它给出了零作为输出.我知道在C++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我.

c compiler-construction

24
推荐指数
3
解决办法
7314
查看次数

15
推荐指数
0
解决办法
436
查看次数

为什么不使用时分配堆栈内存?

考虑以下示例:

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)

为什么要分配堆栈空间?它根本没有被使用。该pushpop可以省略。MSVC 和 gcc 的优化构建也为此功能使用堆栈空间(请参阅有关Godbolt 的内容),因此必须有一个原因。

c++ code-generation abi calling-convention stack-allocation

14
推荐指数
1
解决办法
311
查看次数

(为什么)空字符串有地址?

我猜不是,但这样的输出表明它确实如此

string s="";
cout<<&s;
Run Code Online (Sandbox Code Playgroud)

拥有地址的空字符串有什么意义?你认为不应该花费任何记忆吗?

c++

13
推荐指数
3
解决办法
1768
查看次数

带有'this'指针的类的大小

没有数据成员的类的大小返回为1个字节,即使声明了隐含的"this"指针.返回的大小不应该是4个字节(在32位机器上)?我遇到过一些文章,表明"this"指针不计算用于计算对象的大小.但我无法理解这个原因.此外,如果任何成员函数声明为virtual,则类的大小现在返回为4个字节.这意味着计算vptr以计算对象的大小.为什么在计算对象大小时会考虑vptr并忽略'this'指针?

c++ sizeof

7
推荐指数
1
解决办法
3939
查看次数

什么是sizeof(某事)== 0?

我有一个模板,它采用具有不同值的结构,例如:

struct Something
{
    char str[10];
    int value;
    ...
    ...
};
Run Code Online (Sandbox Code Playgroud)

在函数内部我使用sizeof运算符:跳入内存 sizeof(Something);

有时我想不跳任何东西; 我希望sizeof返回零.如果我输入一个空结构,它将返回1; 我可以在模板中放置什么来使sizeof返回零?

c++ templates sizeof

6
推荐指数
2
解决办法
1634
查看次数

C++:虚拟继承

请考虑以下代码:

#...
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.

题:

  1. sizeof(A)= 1byte,这个位置对于编译器/我们来说意义重大.
  2. 为什么编译器在实际上没有任何内容时,在C类对象中添加vptr.
  3. 如果我们没有任何虚函数,编译器会向派生对象添加额外的vptr.

*.这是我的第一个问题,如果你发现任何错误,请纠正我.

c++ virtual-inheritance

5
推荐指数
1
解决办法
211
查看次数

课程的大小是多少?

可能重复:
C++中的空类

class Class1
{
char c;
};

class Class2
{
};
Run Code Online (Sandbox Code Playgroud)

Class1和Class2的大小是多少?

在VC6中,我得到了两个1.有人可以解释一下吗?

c++ class

4
推荐指数
1
解决办法
211
查看次数

C++中最小的标准兼容对象大小?

我知道空类的大小由标准定义为非零.在大多数实现中,它通常是 1个字节.
但是,C++标准是否指定了对象的最小可能大小?假设按照标准,空类对象的大小至少为 1个字节,这是合乎逻辑的.

c++ sizeof

2
推荐指数
1
解决办法
157
查看次数