102得票3回答
C语言中的结构体内存布局

我有C#编程背景。像C这样的低级语言对我来说还是新手。 在C#中,struct的内存布局默认由编译器进行排列。编译器可以隐式地重新排序数据字段或在字段之间填充额外的位。因此,我必须指定一些特殊的属性来覆盖此行为以获得精确的布局。 据我所知,C不会默认重新排序或对齐struct的内存布局。但...

61得票7回答
如何组织结构体中的成员以在对齐时浪费最少的空间?

[这不是结构体内部填充和打包的重复问题。那个问题是关于填充何时发生的。这个问题是关于如何处理它的。] 我刚意识到在C ++中由于对齐而浪费了多少内存。考虑以下简单的例子:struct X { int a; double b; int c; }; int main() ...

43得票2回答
C语言中数据段和bss段的区别

当通过readelf检查目标文件的反汇编时,我发现data和bss段包含相同的偏移地址。 data部分将包含初始化的全局和静态变量。BSS将包含未初始化的全局和静态变量。 1 #include<stdio.h> 2 3 static void display(int i...

36得票7回答
C语言中指针比较是如何工作的?比较不指向同一数组的指针是否可行?

在K&R(The C Programming Language 2nd Edition)第5章中,我读到以下内容: 引用: 首先,在某些情况下可以比较指针。 如果p和q指向同一数组的成员,则关系如==、!=、<、>=等可以正常工作。 这似乎意味着只有指向同一数组的...

34得票1回答
为什么Linux二进制文件的虚拟内存地址从0x8048000开始?

在Ubuntu x86系统上反汇编ELF二进制文件时,我注意到代码(.text)部分从虚拟地址0x8048000开始,所有较低的内存地址似乎都未使用。这似乎是相当浪费的,而Google上找到的都是涉及STACK_TOP的民间传说或者防止空指针解引用的保护。后一种情况看起来可以通过使用单个页面而...

31得票3回答
Rust中的精确内存布局控制?

据我所知,Rust编译器可以对结构体的每个字段进行打包、重新排序和添加填充。如果我需要指定精确的内存布局,该怎么办? 在C#中,我有StructLayout属性,在C/C++中,我可以使用各种编译器扩展。我可以通过检查预期值位置的字节偏移量来验证内存布局。 我想编写使用自定义着色器的Ope...

30得票2回答
结构体对齐 C/C++

在c/c++中(我认为它们在这方面是一样的),如果我有以下内容: struct S { T a; . . . } s; 以下的内容是否保证为真? (void*)&s == (void*)&s.a; 换句话说,是否有任何保证在第一个成员之前不会有任何填...

28得票4回答
当int64_t更改为int32_t时,为什么类大小会增加?

在我的第一个例子中,我使用了两个int64_t位域。当我编译并获取类的大小时,得到的大小为8。class Test { int64_t first : 40; int64_t second : 24; }; int main() { std::cout <&lt...

27得票2回答
具有单个基本类型数组成员的标准布局结构体的保证内存布局

考虑以下简单的结构体:struct A { float data[16]; }; 我的问题是: 假设平台上float是32位IEEE754浮点数(如果这有关系的话),C++标准是否保证struct A的预期内存布局?如果不是,它保证了什么,以及/或者强制保证的方法是什么? 我所说的...

25得票2回答
参考文献是否有存储位置?

引用是否有存储位置,还是只是另一个位置的别名?这在C++版本之间是否不同,还是在所有C++版本中都保持一致?如果引用有一个存储位置,是否只允许像指针类型一样进行值语义? 当您将引用用作以下方式时,它会如何工作:struct aStruct{ int aVariable; aClas...