如果sizeof空类是1字节,那么为什么sizeof类有int数据成员而不是5字节?
class A
{
int a;
};
class B
{
};
int main()
{
std::cout << sizeof(A)<< ":" << sizeof(B) << "\n";
}
我知道预期的输出是4:1,但我只想知道为什么sizeof(A)是4字节而不是5字节。有助于区分不同对象地址的1个字节发生了什么?
下面的代码片段。
/*This program demonstartes how a virtual table pointer
* adds to a size of a class*/
class A{
};
class X{
public:
void doNothing(){}
private:
char a;
};
class Z:public X {
public:
void doNothing(){}
private:
char z;
};
class Y{
在fedora-linux上用gcc 4.8.2和llvm/clang 3.4编译我的代码为C++11,我得到了奇怪的结果,我真的不能解释……这里有一个类似的程序fedora。
#include <iostream>
using namespace std;
struct A {};
struct C {};
struct B1 : A { union { A a;}; };
struct B2 : A { union { C c;}; };
int main()
{
cout << sizeof(B1) << " " <&
我们都知道,空类或空类对象的大小将是1字节。我遇到了sizeof类,它的对象以0的形式出现。该程序在语法上是正确的,因为没有编译或运行时错误。这是未定义的行为吗?我试图执行的用例有任何意义,而且看起来是有效的吗?没有给出类中数组的准确下标或大小是一个大错误吗?代码片段如下所示:
#include<iostream>
using namespace std;
class A
{
char a[];
};
int main()
{
A b;
cout<<sizeof(A)<<endl;
cout<<sizeof(b)&l
我现在正在测试C++ sizeof operator的结果:
class S{};
class A:public S{
virtual void fun()=0;
};
class B{};
class C : public B,public A {};
int main(){
cout<<sizeof(A)<<endl;// result is 4
cout<<sizeof(C)<<endl;// result is 8
}
但是如果我去掉类S的扩展:
class A{
virtual void fun(
由于空类的大小是1字节,但是当这个空类实际上继承了(在gcc编译器上) sizeof(derived1)的答案是8字节时...,为什么这会发生,因为sizeof(derived1)必须是sizeof(char)+sizeof(virtual pointer),这是1+4..i.e 5字节。那么,这额外的3个字节是从哪里来的...?
#include <iostream>
using namespace std;
class Empty
{};
class Derived1 : virtual public Empty<br>
{
char c;
};
in
考虑一下
struct Base {};
struct Empty {};
struct X : Base {
int i;
[[no_unique_address]] Empty e;
};
static_assert(sizeof(X) == 4);
X继承空Base并获取,并且由于其成员e也使用[[no_unique_address]]属性,这使得X的大小仅为int的大小。
但是,当我使用X作为继承空Base的另一个结构Base的成员变量时,Y的大小突然变成8。
struct Y : Base {
X x;
[[no_unique_address]] Empty e
摘要:抽象套接字地址的区别在于sun_path是空字节('\0')。这个命名空间中的套接字地址是由地址结构的指定长度覆盖的sun_path中的额外字节提供的。(名称中的空字节没有特殊意义)。该名称与文件系统路径名没有连接。当一个抽象套接字的地址由getsockname(2)、getpeername(2)和accept(2)返回时,返回的addrlen大于sizeof of (Sa_family_t)(即大于2),并且套接字的名称包含在sun_path的第一个字节(addrlen -sizeof of (Sa_family_t))中。抽象套接字命名空间是一个不可移植的Linu
下面是打印不同类别大小的代码
#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:
vi
请考虑以下类型:
struct A {};
struct B : A { int i; };
标准要求的sizeof(A) > 0。
由于空基优化,sizeof(B)应为4。然而,在GCC 4.1.1上是5(我在这方面使用的是1包)。而且不一致-我的一些文件得到了它,一些没有。还不能确定有什么不同,我们有一个很大的问题。
在我使用的其他三个编译器(微软和飞思卡尔)上,我没有这个问题。根据的说法,空基优化显然是可选的。
在GCC 4.1.1中有没有编译器选项或编译指示来调优这一点?我可以解决这个问题,但我想先了解发生了什么。我用谷歌搜索了一段时间,似乎什么也找不到。
我有两个类,如下
class A
{
};
class B
{
int a[];
};
int main()
{
cout << sizeof(A) <<endl; //outputs 1
cout << sizeof(B) <<endl; //outputs 0
return 0;
}
我很熟悉空类的大小是1,但是为什么B类的大小会变成0?
这是一个在线C++测试题,已经完成了。
#include<iostream>
using namespace std;
class A
{
};
class B
{
int i;
};
class C
{
void foo();
};
class D
{
virtual void foo();
};
class E
{
int i ;
virtual void foo();
};
class F
{
int i;
void foo();
};
class G
{
void foo();
int i;
void foo1();
有这样的代码:
#include <iostream>
class Base
{
int x;
};
class Derived : virtual public Base
{
int y;
};
int main()
{
std::cout << sizeof(Derived) << std::endl; // prints 12
return 0;
}
我已经读过,当某些类实际上被继承时,就会为派生类创建空vtable,因此内存布局如下:
Derived::ptr to empty vtable
Derived::