正确清除数组
Properly clearing an array
我见过用 0
填充 char[]
的两种不同方法(在此示例中,在初始化时):
/* method 1 */
char foo[1024] = {0};
/* method 2 */
char foo[1024];
memset(foo, '[=10=]', sizeof(foo));
这两个代码之间的主要区别是什么?它们在功能等方面有何不同?
第一种方法通常更好,因为它零初始化所有成员。 Mem 设置为 0 并不总是与零初始化相同,特别是对于浮点和指针成员,它们可能有 0 个值,但并非所有位都为零。
性能方面,我不知道哪个更快,你必须衡量它。顺便说一下,你可以在 memset 中使用 0
而不是 '[=12=]'
。
memset(foo, 0, sizeof(foo));
What are the main differences between the two codes?
在情况 1 中,数组从可以使用的那一刻起就被清零了,因为它得到了初始化。
在情况 2 中,它的内容只有在调用 memset()
.
之后才被明确定义
本质区别在于,对于情况 2,foo
的内容为 "garbage" 存在间隙。情况 1 并非如此。
/* method 1 */
char foo[1024] = {0};
在方法 1 中,数组的设置发生在程序加载时,通常来自文字,并且对于数组的 'scope' 中的每个条目只能发生一次。
/* method 2 */
char foo[1024];
memset(foo, '[=11=]', sizeof(foo));
在方法 2 中,数组的设置发生在运行时,消耗运行时 CPU 个周期,并且可以根据需要多次发生。
这两个代码的效果是一样的。在这两种情况下,编译器可能会生成相同的程序集。然而,第一个更容易阅读和维护。
您不可能不小心将第一个数据写入错误的数据长度。
此外,= { 0 };
习语可用于初始化所有命名数组和结构:整数获取 0
值,浮点数获取 0.0
,指针获取空指针。 memset
版本只保证这三件事中的第一件事。
因此,如果您正在编写可移植代码,有时无论如何您都需要使用 = { 0 }
-- 所以您不妨每次都使用它。
我见过用 0
填充 char[]
的两种不同方法(在此示例中,在初始化时):
/* method 1 */
char foo[1024] = {0};
/* method 2 */
char foo[1024];
memset(foo, '[=10=]', sizeof(foo));
这两个代码之间的主要区别是什么?它们在功能等方面有何不同?
第一种方法通常更好,因为它零初始化所有成员。 Mem 设置为 0 并不总是与零初始化相同,特别是对于浮点和指针成员,它们可能有 0 个值,但并非所有位都为零。
性能方面,我不知道哪个更快,你必须衡量它。顺便说一下,你可以在 memset 中使用 0
而不是 '[=12=]'
。
memset(foo, 0, sizeof(foo));
What are the main differences between the two codes?
在情况 1 中,数组从可以使用的那一刻起就被清零了,因为它得到了初始化。
在情况 2 中,它的内容只有在调用 memset()
.
本质区别在于,对于情况 2,foo
的内容为 "garbage" 存在间隙。情况 1 并非如此。
/* method 1 */
char foo[1024] = {0};
在方法 1 中,数组的设置发生在程序加载时,通常来自文字,并且对于数组的 'scope' 中的每个条目只能发生一次。
/* method 2 */
char foo[1024];
memset(foo, '[=11=]', sizeof(foo));
在方法 2 中,数组的设置发生在运行时,消耗运行时 CPU 个周期,并且可以根据需要多次发生。
这两个代码的效果是一样的。在这两种情况下,编译器可能会生成相同的程序集。然而,第一个更容易阅读和维护。
您不可能不小心将第一个数据写入错误的数据长度。
此外,= { 0 };
习语可用于初始化所有命名数组和结构:整数获取 0
值,浮点数获取 0.0
,指针获取空指针。 memset
版本只保证这三件事中的第一件事。
因此,如果您正在编写可移植代码,有时无论如何您都需要使用 = { 0 }
-- 所以您不妨每次都使用它。