- 主题:从一段代码看编译器优化带来的编程挑战
例子来自于当前一个大型项目。简化起见,代码原理大概是下面的样子。
std::vector<int> test_re(int a)
{
std::vector<int> result;
if (a < 0)
{
return result;
}
result.push_back(a*100);
result.push_back(a*200);
}
int main()
{
auto a = test_re(10);
std::cout << "a.size() = "<<a.size() << std::endl;
}
这段代码运行的很好,也没啥问题。直到有一天,由于某种功能变化,有人把a提前声明了。然后系统就崩了。
本着谁修改就是谁的问题,开发人员懵逼了很久,直到看了test_re的源码.....
--
修改:foliver FROM 124.77.82.*
FROM 124.77.82.*
怎么编译通过的?
【 在 foliver 的大作中提到: 】
: 例子来自于当前一个大型项目。简化起见,代码原理大概是下面的样子。
: std::vector<int> test_re(int a)
: {
: ...................
--
FROM 158.140.1.*
这个test_re怎么最后没返回东西?
【 在 foliver 的大作中提到: 】
: 例子来自于当前一个大型项目。简化起见,代码原理大概是下面的样子。
: std::vector<int> test_re(int a)
: {
: ...................
--
FROM 103.90.178.*
能不能说说用的什么版本的编译器
有没有看看该版本的编译器支持什么lint
【 在 foliver 的大作中提到: 】
: 例子来自于当前一个大型项目。简化起见,代码原理大概是下面的样子。
: std::vector<int> test_re(int a)
: {
: ...................
--
FROM 114.242.248.*
有编译警告,应该是被无视了
我现在有个工程,近2千的编译警告,根本没人管,只要不出问题就不影响KPI.
我挑着改了一些。这应该是很多小项目的现状。
【 在 tis 的大作中提到: 】
: 怎么编译通过的?
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
警告可以升级成error
项目不重视自然就越来越乱了
那也不是编译器的错误。
现在类型推导这么牛逼了,楼主的这个例子根本不算啥难事
【 在 z16166 的大作中提到: 】
: 有编译警告,应该是被无视了
: 我现在有个工程,近2千的编译警告,根本没人管,只要不出问题就不影响KPI.
: 我挑着改了一些。这应该是很多小项目的现状。
: ...................
--
FROM 114.242.248.*
肯定不能算编译器的锅了
我之前在本版贴过一个没return语句的函数,这种UB被g++给优化成了死循环,理论上优化成啥都有可能。
【 在 gfkid 的大作中提到: 】
: 警告可以升级成error
: 项目不重视自然就越来越乱了
: 那也不是编译器的错误。
: ...................
--
FROM 114.241.228.*
原来的代码,这个编译器直接启用了rvo优化,result实际上被调用着直接替代了。所以一切正常。
【 在 ArchLinux 的大作中提到: 】
: 这个test_re怎么最后没返回东西?
:
: 【 在 foliver 的大作中提到: 】
: ...................
--来自微水木3.5.10
--
FROM 124.77.82.*
晕 你这个说的怎么感觉是编译器的锅
【 在 z16166 的大作中提到: 】
: 肯定不能算编译器的锅了
: 我之前在本版贴过一个没return语句的函数,这种UB被g++给优化成了死循环,理论上优化成啥都有可能。
:
--
FROM 114.249.22.*
UB啊,兄弟
【 在 gfkid 的大作中提到: 】
: 晕 你这个说的怎么感觉是编译器的锅
: :
--
FROM 114.241.228.*