gpt4 book ai didi

c++ - 未经 GCC 优化编译的简单 C++ 程序不会生成预期结果

转载 作者:太空宇宙 更新时间:2023-11-04 15:00:19 28 4
gpt4 key购买 nike

今天,当我尝试使用 GCC7 编译一个非常简单的 C++ 程序时,我遇到了一个非常奇怪的问题:程序没有向构造函数中的 vector 添加任何元素,当编译时没有优化(例如 -O0/-Og ) 来自 Red Hat Enterprise Linux 7 上的 Devtoolset-7 的 GCC 7.2.1。只有添加优化开关(例如 -O/-O1/-O2/...),编译后的二进制文件才能生成预期结果。但为什么会这样?

顺便说一句:

  1. 在没有优化的情况下,RHEL7 上的 GCC 7.2.1 和 Mac(Homebrew 版本)上的 GCC 7.3.0 编译的二进制文件表现不同:前者不添加任何元素,而后者添加 2 个元素。
  2. 无论是否开启优化clang都没有这个问题)

代码:

#include <vector>
#include <utility>
#include <iostream>

class Container
{
std::vector<std::size_t> elements;

public:

Container() {}

Container(std::size_t n)
{
std::cout << "Creating " << n << " elements:";
for(int i; i<n; ++i)
{
std::cout << " " << i+1;
elements.push_back(i+1);
}
std::cout << '\n';
}

Container(Container& c) : elements{c.elements} {}

Container(Container&& c) : elements{std::move(c.elements)} {}

virtual ~Container() noexcept {}

Container& operator=(const Container& c)
{
if(this != &c)
{
elements = c.elements;
}
return *this;
}

Container& operator=(Container&& c)
{
if(this != &c)
{
elements = std::move(c.elements);
}
return *this;
}

void print()
{
std::cout << "Container has " << elements.size() << " elements:" << '\n';
for(auto it=elements.cbegin(); it!=elements.cend(); ++it)
{
if(it == elements.cbegin()) std::cout << *it;
else std::cout << ", " << *it;
}
if(elements.size()>0) std::cout << '\n';
}
};

Container makeContainer()
{
std::cout << "Inside makeContainer()" << '\n';

std::cout << "Before:" << '\n';
Container c(3);
c.print();

std::cout << "Temporary:" << '\n';
Container c_tmp(3);
c_tmp.print();
c = c_tmp;

std::cout << "After:" << '\n';
c.print();
return c;
};

int main()
{
Container c = makeContainer();
std::cout << "Inside main()" << '\n';
c.print();
return 0;
}

预期输出:

Inside makeContainer()
Before:
Creating 3 elements: 1 2 3
Container has 3 elements:
1, 2, 3
Temporary:
Creating 3 elements: 1 2 3
Container has 3 elements:
1, 2, 3
After:
Container has 3 elements:
1, 2, 3
Inside main()
Container has 3 elements:
1, 2, 3

实际输出:

Inside makeContainer()
Before:
Creating 3 elements:
Container has 0 elements:
Temporary:
Creating 3 elements:
Container has 0 elements:
After:
Container has 0 elements:
Inside main()
Container has 0 elements:

最佳答案

如果你不给变量赋值,它的状态是不确定的。

在 Debug模式下,编译器可以将值置为零来初始化不确定的值,以帮助调试。但在发布中,这种额外的未请求初始化将不会发生。

    for(int i; i<n; ++i)  // Here you have declared `i` but not initialized it.

作为 Release模式的结果,该值可能大于 n,因此没有插入任何元素。

注意:读取初始化变量的值是 UB(因此您的整个程序可以做任何事情)。

关于c++ - 未经 GCC 优化编译的简单 C++ 程序不会生成预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49501959/

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