c - 嵌套结构中的数据如何存储和填充?

标签 c gcc memory struct

看看这两个结构

struct parent_t
{
    short num1;
    char chrA;
    char chrB;
    char chr1;
};

struct child_t
{
    struct parent_t parent;
    char chr2;
};

正如我们所知,可能会向结构成员添加填充,以将其增加到适合 RAM 的舒适大小。在 parent_t 的情况下,chr1 可能会被填充,因为它很小。而 chrAchrB 可能会合并并在 ram 中共享同一个词。

现在,如果我们查看 child_t,它有 chr2,它本身会被填充。我的问题是 chr1chr2 是否会被优化,例如 chrAchrB?如果有,那叫什么?

对于这个例子,我假设 1 个单词 = 1 个短字符 = 2 个字符。

最佳答案

My question is will chr1 and chr2 be optomise such as chrA and chrB?

不,它们不会按照您描述的方式进行优化。

原因是sizeof(struct parent_t)必须在程序中处处相同。

如果对其进行优化,此代码将失败:

struct parent_t p;
struct child_t c;
//... initialize p
memcpy(&c.parent, &p, sizeof(struct parent_t));

这样的代码是有效的并且必须工作。换句话说 - 您描述的优化不会发生。

关于c - 嵌套结构中的数据如何存储和填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921445/

相关文章:

r - 增加内存限制/无法分配大小为 69.2GB 的向量

c - 给定两个字符串,找到两个字符串共有的单词

c - 如何在 Linux 中的 C 程序中禁用中断

ubuntu - 如何使用 libcurl 和 C : 从 IMAP 服务器读取消息

c++ - 使用 malloc 分配比现有内存更多的内存

python - tensorflow - TFRecordWriter 在写入文件时占用太多内存?

c - openssl 握手失败

C:指向结构数组的动态指针数组

c - 为什么 .rodata 部分中的静态字符串在 GCC 中有一个四点前缀?

c - 使用 GraphicsMagick C API,未知类型图像编译错误