初始化 C 结构与分配成员
Initialize C struct vs assign members
我想知道初始化结构成员的最佳实践是什么。
例如,对于这个结构,哪个选项更好,为什么?特别是在可读性和性能方面?
typedef struct
{
int a;
char b;
} str_t;
选项 1
void foo1(int param_a, char param_b)
{
str_t str = {
.a = param_a,
.b = param_b
};
...
}
堆栈中省略的成员是什么,零或垃圾?
选项 2
void foo2(int param_a, char param_b)
{
str_t str;
str.a = param_a;
str.b = param_b;
...
}
此选项将允许零初始化(= {0};
)。但我想这会强制执行运行时分配,对吗?
奖金
此外,常数值会有所不同吗?
void foo1()
{
str_t str = {
.a = 5,
.b = 10
};
...
}
void foo2()
{
str_t str;
str.a = 5;
str.b = 10;
...
}
选项 1 有效。未提及的元素将是 'zero initialized' — 给定一个默认值,即零。它与函数中的 static
变量一起正常工作。它应该是你的首选。
选项 2 也有效。它可能会更慢。它完全不适合 static
个变量;赋值发生在每次调用函数时。
奖励:在初始化器中使用常量而不是变量对分析的影响很小——使用指定初始化器的选项 1 是最好的方法。
我想知道初始化结构成员的最佳实践是什么。
例如,对于这个结构,哪个选项更好,为什么?特别是在可读性和性能方面?
typedef struct
{
int a;
char b;
} str_t;
选项 1
void foo1(int param_a, char param_b)
{
str_t str = {
.a = param_a,
.b = param_b
};
...
}
堆栈中省略的成员是什么,零或垃圾?
选项 2
void foo2(int param_a, char param_b)
{
str_t str;
str.a = param_a;
str.b = param_b;
...
}
此选项将允许零初始化(= {0};
)。但我想这会强制执行运行时分配,对吗?
奖金
此外,常数值会有所不同吗?
void foo1()
{
str_t str = {
.a = 5,
.b = 10
};
...
}
void foo2()
{
str_t str;
str.a = 5;
str.b = 10;
...
}
选项 1 有效。未提及的元素将是 'zero initialized' — 给定一个默认值,即零。它与函数中的 static
变量一起正常工作。它应该是你的首选。
选项 2 也有效。它可能会更慢。它完全不适合 static
个变量;赋值发生在每次调用函数时。
奖励:在初始化器中使用常量而不是变量对分析的影响很小——使用指定初始化器的选项 1 是最好的方法。