结构体与结构体指针大小相同时,应传值还是传指针?
结构体传值vs传指针的内存优化选择疑问
我在编写程序时,为简化函数声明创建了工具结构体Foo。它仅包含两个各有两种取值的枚举,因此传入函数的Foo仅有四种可能实例,且这些实例的内部值只会被访问、不会被修改。目前我是创建四个静态常量,以传值方式传递给函数。
我了解传值调用结构体时,每次函数调用都会复制成员并压入栈中。既然这些都是常量,也可以改为传递指针读取值,还能使用static const Foo *A = &(Foo)...这类现代语法。但在我的平台上,sizeof(Foo)与sizeof(Foo*)均为8字节,我不确定哪种方式更优:两者内存占用看似相同,也不清楚栈复制与指针解引用的开销差异。
我还考虑过将Foo的枚举成员声明为uint8_t(强制大小为1字节而非当前的4字节),甚至将整个Foo设为uint8_t并用最后两位存储枚举值,但担心这会降低代码可读性——而且这两个枚举还会单独在外部使用,可能需要进行代码重构,成本较高。
需说明的是,该程序优先优化内存占用而非执行速度;栈大小无限制,但整体内存 footprint 是核心优化关注点。
代码示例
类型定义
typedef enum { A = 0, B = 1 } Bar; typedef enum { C = 0, D = 1 } Baz; typedef struct { Bar r; Baz z; } Foo;
方案一:传值方式
static const Foo foo0 = { .r=0, .z=0 }; static const Foo foo1 = { .r=1, .z=0 }; static const Foo foo2 = { .r=0, .z=1 }; static const Foo foo3 = { .r=1, .z=1 }; void func(const Foo f);
方案二:传指针方式
static const Foo *foo0 = &(Foo){ .r=0, .z=0 }; static const Foo *foo1 = &(Foo){ .r=1, .z=0 }; static const Foo *foo2 = &(Foo){ .r=0, .z=1 }; static const Foo *foo3 = &(Foo){ .r=1, .z=1 }; void func(const Foo *f);
请问这两种方案哪种更适合我的场景?
内容的提问来源于stack exchange,提问作者user21749640
相关产品推荐
相关产品推荐

