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方式进行初始化
如果哪天如果有人问我这种问题,我应该怎么回答呢?是不是要把高版本给过滤掉,像上学时回答考试问题一样。。。
我最擅长从零开始创造世界,所以从来不怕失败,它最多也就让我一无所有。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 赛门铁克公测新杀毒软件