You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体与结构体指针大小相同时,应传值还是传指针?

结构体传值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:07:05