MST

星途 面试题库

面试题:C语言结构体变量声明的内存相关考察

假设有两个结构体,结构体`A`包含一个`int`类型成员`a`和一个结构体`B`类型的成员`b`,结构体`B`包含一个`float`类型成员`c`和一个`double`类型成员`d`。请说明在声明结构体`A`的变量时,内存对齐是如何影响变量声明及内存占用的,如何手动控制内存对齐以优化内存使用,并给出相关代码示例。
21.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 内存对齐对变量声明及内存占用的影响
    • 在C和C++中,结构体的内存布局会受到内存对齐规则的影响。内存对齐是为了提高CPU对内存的访问效率。
    • 结构体B中,float类型通常占4字节,double类型占8字节。由于对齐规则,结构体B的大小通常不是4 + 8 = 12字节,而是16字节(假设double类型的对齐要求为8字节,float类型的对齐要求为4字节,结构体B的对齐要求是其最大成员的对齐要求,即8字节,所以12字节要补齐到16字节)。
    • 结构体A中,int类型通常占4字节,结构体B类型成员b占16字节。结构体A的对齐要求同样是其最大成员的对齐要求,即8字节(因为B的对齐要求是8字节)。所以结构体A的大小不是4 + 16 = 20字节,而是24字节(20字节要补齐到24字节,以满足8字节对齐)。
  2. 手动控制内存对齐以优化内存使用
    • 在GCC编译器中,可以使用__attribute__((packed))来取消结构体的内存对齐,以达到最小内存占用。在Microsoft Visual C++中,可以使用#pragma pack(n)来指定对齐字节数nn通常是1、2、4、8等2的幂次方)。
  3. 代码示例
    • GCC编译器
#include <stdio.h>

// 结构体B
struct __attribute__((packed)) B {
    float c;
    double d;
};

// 结构体A
struct __attribute__((packed)) A {
    int a;
    struct B b;
};

int main() {
    printf("Size of struct B: %zu bytes\n", sizeof(struct B));
    printf("Size of struct A: %zu bytes\n", sizeof(struct A));
    return 0;
}
  • Microsoft Visual C++
#include <iostream>

// 结构体B
#pragma pack(push, 1)
struct B {
    float c;
    double d;
};
#pragma pack(pop)

// 结构体A
#pragma pack(push, 1)
struct A {
    int a;
    struct B b;
};
#pragma pack(pop)

int main() {
    std::cout << "Size of struct B: " << sizeof(struct B) << " bytes" << std::endl;
    std::cout << "Size of struct A: " << sizeof(struct A) << " bytes" << std::endl;
    return 0;
}

通过手动控制内存对齐,结构体B的大小变为4 + 8 = 12字节,结构体A的大小变为4 + 12 = 16字节,从而优化了内存使用。但需要注意,取消内存对齐可能会降低CPU对内存的访问效率,在实际应用中需要权衡。