可能重复:
C++:空类对象的大小是多少?
为什么以下输出1?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 据对我来说,它是零,但似乎有一点混乱这里
我用gcc编译器对它进行了测试,它给出了零作为输出.我知道在C++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我.
C++中是否存在非静态块?
如果不是,如何优雅地模仿它?
我想替换类似的东西: -
class C{
public: void ini(){/* some code */}
};
class D{
std::vector<C*> regis; //will ini(); later
public: C field1;
public: C field2;
public: C field3; //whenever I add a new field, I have to ... #1
public: D(){
regis.push_back(&field1);
regis.push_back(&field2);
regis.push_back(&field3); //#1 ... also add a line here
}
public: void ini(){
for(auto ele:regis){
ele->ini();
}
}
};
Run Code Online (Sandbox Code Playgroud)
与: -
class D{
std::vector<C*> regis;
public: C field1;{regis.push_back(&field1);}//less error-prone (because it is on-site)
public: C field2;{regis.push_back(&field2);}
public: …Run Code Online (Sandbox Code Playgroud) 我看到这篇文章解释了 C 中的结构体大小不能为零,并且必须至少有一个命名字段才不会出现未定义的行为。然而,在 Rust 中,我们可以拥有这样的结构。我们还可以#[repr(C)]从文档中将结构标记为“做 C 所做的事情”。
所以很自然地,我去操场尝试这个:
#[repr(C)]
struct ZeroSized;
fn main() {
println!("Size: {}", std::mem::size_of::<ZeroSized>());
}
Run Code Online (Sandbox Code Playgroud)
这段代码确实打印出了 0。
我想知道#[repr(C)]如果在 C 中禁止使用零大小的结构,Rust 是否允许它们,甚至是 UB?这样一个结构体的最终大小实际上会是 0 吗?如果我在内存中复制这个结构会发生什么?我什至可以有一个指向它的指针吗?