gpt4 book ai didi

c++ - 局部变量初始化应该是强制性的吗?

转载 作者:IT老高 更新时间:2023-10-28 23:22:46 26 4
gpt4 key购买 nike

未初始化的本地人引起的维护问题(尤其是指针)对于任何做过一些 c/c++ 维护或增强的人来说都是显而易见的,但我仍然看到它们并且偶尔听到作为它们的理由给出的性能影响。

在 c 中很容易证明冗余初始化已被优化:

$ less test.c
#include <stdio.h>
main()
{
#ifdef INIT_LOC
int a = 33;
int b;
memset(&b,66,sizeof(b));
#else
int a;
int b;
#endif
a = 0;
b = 0;
printf ("a = %i, b = %i\n", a, b);
}

$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

[未优化:]

$ gcc test.c -S -o no_init.s; gcc test.c -S -D INIT_LOC=1 -o init.s; diff no_in
it.s init.s
22a23,28
> movl $33, -4(%ebp)
> movl $4, 8(%esp)
> movl $66, 4(%esp)
> leal -8(%ebp), %eax
> movl %eax, (%esp)
> call _memset
33a40
> .def _memset; .scl 3; .type 32; .endef

[优化:]

$ gcc test.c -O -S -o no_init.s; gcc test.c -O -S -D INIT_LOC=1 -o init.s; diff
no_init.s init.s
$

那么在什么情况下强制变量初始化不是一个好主意的 WRT 性能?

如果适用,无需限制对 c/c++ 的回答,但请明确语言/环境(以及比推测更可取的可重现证据!)

最佳答案

简短回答:声明变量尽可能接近第一次使用,如果仍然需要,初始化为“零”。

长答案:如果您在函数的开头声明一个变量,并且直到稍后才使用它,您应该重新考虑将变量放置到尽可能本地的范围内。然后,您通常可以立即为其分配所需的值。

如果您必须声明它未初始化,因为它是在条件中分配的,或者通过引用传递并分配给,则将其初始化为与 null 等效的值是一个好主意。如果您在 -Wall 下编译,编译器有时可以节省您的时间,因为如果您在初始化变量之前读取变量,它会发出警告。但是,如果您将其传递给函数,它不会警告您。

如果您安全行事并将其设置为等效空值,则如果您传递给它的函数覆盖它,您不会造成任何伤害。但是,如果您传递给它的函数使用该值,则几乎可以保证您的断言失败(如果您有断言),或者至少在您使用空对象的第二次发生段错误。随机初始化可以做各种坏事,包括“工作”。

关于c++ - 局部变量初始化应该是强制性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/139686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com