gpt4 book ai didi

c++ - C++ 中的函数 const 局部对象会怎样?

转载 作者:太空狗 更新时间:2023-10-29 23:25:30 26 4
gpt4 key购买 nike

我想知道为什么会这样:后面的两个例子提供了截然不同的结果,第一个实际上让我震惊。

示例 1:

#include <iostream>

class A
{
public:
A() {
for(int i = 0; i < 10000; ++i)
for(int j = 0; j < 10000; ++j)
m += i+j;
}
~A() {}

double m;
};

void foo()
{
const A a;

std::cout << a.m << std::endl;
}//foo

int main()
{
for(int i = 0; i < 10; ++i)
foo();

return 0;
}//main

结果:

9.999e+11
1.9998e+12
2.9997e+12
3.9996e+12
4.9995e+12
5.9994e+12
6.9993e+12
7.9992e+12
8.9991e+12
9.999e+12

例子2:

#include <iostream>

class A
{
public:
A() {
for(int i = 0; i < 10000; ++i)
for(int j = 0; j < 10000; ++j)
m += i+j;
}
~A() {}

double m;
};

void foo()
{
const static A a;

std::cout << a.m << std::endl;
}//foo

int main()
{
for(int i = 0; i < 10; ++i)
foo();

return 0;
}//main

结果:

9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11
9.999e+11

示例 1 和示例 2 之间的唯一区别是“静态”。

我承认第一个 const 没有像我预期的那样行事。

提前致谢。


伙计们,你说的太对了!我该死。所以……

更重要的是,使用 const static 本地对象总是比只使用 const 本地对象更好吗??

最佳答案

你有未定义的行为,因为数据成员 A::m 在写入它之前没有被初始化:

m += i+j;

你应该在写入之前将它初始化为有效的东西。 0 似乎是个不错的选择:

A() : m(0) {
for(int i = 0; i < 10000; ++i)
for(int j = 0; j < 10000; ++j)
m += i+j;
}

当您声明一个static A 实例时,所有数据成员都被零初始化,并且在程序流第一次到达声明时调用构造函数。这掩盖了未初始化数据成员的影响。

请注意,在 C++11 中,您还可以在声明点进行初始化:

double m = 0;

关于c++ - C++ 中的函数 const 局部对象会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975591/

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