c++ 默认构造函数 不同编译器debug和release的区别

这几年一直在linux上开发,用的gcc版本比较高,最近把gcc降到4.8.5(centos 7默认版本)后,出现了一些成员变量初始化的问题。

看示例:

#include <iostream>
class Test
{
public:
Test() = default;
// Test(const Test& value) = default;
// Test& operator=(const Test &value) = default;
~Test() = default;
int GetA() { return m_a; }
void SetA(int value) { m_a = value; }
private:
int m_a = 0;
};
int main(int argc, char **args)
{
Test test;
Test test2 = test;
std::cout << test.GetA() << std::endl;
std::cout << test2.GetA() << std::endl;
test.SetA(1000);
Test test3 = {};
std::cout << test.GetA() << std::endl;
std::cout << test3.GetA() << std::endl;
Test test4 = {test};
std::cout << test.GetA() << std::endl;
std::cout << test4.GetA() << std::endl;
return 0;
}
编译器 debug release
gcc 4.8 2147483647或者-2147483648 0
gcc 8.3 0 0
gcc 9.3 0 0
vs2019 msvc 142 随机数 0
clang 7 随机数 随机数
clang 10 x86 1 随机数
clang 10 x64 0 随机数

gcc 4.8 好像不同硬件上会不一样,在另一 服务器上测试都为0

看来还是使用旧式显式初始化靠谱一些,或者这样写int m_a = 0;使用c++11方式进行初始化
如果哪天如果有人问我这种问题,我应该怎么回答呢?是不是要把高版本给过滤掉,像上学时回答考试问题一样。。。

posted @   至尊王者  阅读(318)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2006-11-28 兼容Vista 赛门铁克公测新杀毒软件
点击右上角即可分享
微信分享提示