草庐IT

C++标准

全部标签

c++ - 从堆栈地址形成指针范围是未定义的行为吗?

一些C或C++程序员惊讶地发现即使是storinganinvalidpointerisundefinedbehavior.但是,对于堆或堆栈数组,可以将地址存储在数组末尾之后,这样您就可以存储“结束”位置以供在循环中使用。但是从单个堆栈变量形成指针范围是否是未定义的行为,例如:charc='X';char*begin=&c;char*end=begin+1;for(;begin!=end;++begin){/*dosomething*/}虽然上面的例子没什么用,但如果某些函数需要一个指针范围,这可能很有用,而且你有一种情况,你只需要一个值来传递它。这是未定义的行为吗?

c++ - 在 GCC 中使用 -O3 有什么缺点吗?

我从事各种语言的软件工程师工作已有13年,不过我现在才刚刚开始学习C和后来的C++。在学习C时,我正在使用GCC编译器编译我的程序,我想知道使用-O3或其他优化标志是否有任何问题。我的软件是否有可能以我无法在不测试编译代码的情况下捕捉到的方式中断,或者在交叉编译期间,我可能会无意中为不同的平台弄乱一些东西。在我盲目地打开这些选项之前,我想知道我能期待什么。此外,由于-Ofast打开了不符合标准的标志,我倾向于不使用它。我对-Ofast很可能会产生“副作用”的假设是否正确?我浏览了一遍https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.

c++ - 为什么用short不好

即使在开发人员保证变量永远不会超过一个字节有时甚至两个字节的脚本中也是很常见的;许多人决定对每个可能的变量使用int类型来表示0-1范围内的数字nay。为什么改用char或short会造成如此大的伤害?我想我听到有人说int是“更标准”的类型。这是什么意思。我的问题是数据类型int是否比short(或其他较小的数据类型)有任何明确的优势,由于这些优势,人们过去几乎总是求助于整数? 最佳答案 作为一般规则,C中的大多数算术都是使用int类型执行的(即,普通int,而不是short或长)。这是因为(a)C的定义是这样说的,这与以下事实有

c++ - 默认的构造函数和析构函数是内联的吗?

我很好奇编译器生成的默认构造函数和析构函数是否是内联的,因为无论哪种方式我都可以证明。一方面,您希望默认构造函数/析构函数不是内联的,这样以后添加它们就不会破坏ABI(因为只有默认值存在时编译的目标文件将内联生成的定义而不是你定义的)。另一方面,对于C++编译器编译的C代码,其性能与使用C编译器编译时一样好,它不能为每个分配的结构添加构造函数/析构函数调用,而在C++中,类之间的唯一功能区别一个结构应该是默认的访问保护。也许链接器以某种方式解决了这个问题?也许答案因编译器而异?这个问题的结果:如果我在C++中有一个POD结构,理论上我可以通过自己定义空的内联构造函数/析构函数来代替默认

c++ - 我可以将代码放在 case 之外的 switch 中吗?

假设:switch(test){//Setsomevariables,callsomefunctions?intx=1;inty=function(x);//case1://Processfortest=1...break;case5://Processfortest=5...break;default://Processforallothercases....}执行我在第一个case之前添加的额外代码是否“合法”?我从未在示例中看到过这一点。 最佳答案 首先是关于switch(真正)如何工作的一些背景知识:switch通常被认为是

c++ - "Empty base optimization"用于 lambda 捕获 - 被标准禁止?为什么?

我最近遇到了一种情况,我最终得到了大量嵌套的lambda表达式到buildasynchronouscomputationchains。.templatestructnode:F{node(F&&f):F{std::move(f)}{}templateautothen(FThen&&f_then){return::node{[p=std::move(*this),t=std::move(f_then)](){}};}};intmain(){autof=node{[]{}}.then([]{}).then([]{});returnsizeof(f);}我在lambda中捕获的所有对象都是空

c++ - 为什么 GCC 似乎没有文件系统标准库?

我遇到文件系统库的问题,它应该包含在c++17编译器中,2天后我尝试在树莓派中安装gcc-7.0.2但它没有工作,它不能识别命令gcc-7或g++-7甚至-std=c++17所以我必须使用apt-getinstall安装g++-6和gcc-6无论如何,在安装6版本后,编译器包含c++17。我使用代码块作为IDE,我必须添加一个新的编译器并添加选项-std=c++17来启用它,但是在主代码中,当我包含文件系统库时,它说没有这样的文件或目录。我的问题是,如何正确添加c++17编译器及其库(如文件系统)?? 最佳答案 GCCv7仍然没有实

c++ - Open Watcom 的优点和缺点

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion因为在StackOverflow上的一些帖子中建议在可行的情况下尝试支持多个(在本例中为C/C++)编译器,因为这会迫使您编写更符合标准的代码并有助于查找错误。所以我一直在寻找额外的免费C/C++编译器,我可以为我的项目添加支持(它是用C/C++编写的(两种语言组合))。我发现OpenWatcom是一个有趣的候选者。所以我的问题是:与其他编译器(例如gcc/g++、VisualC++等)相比,OpenWa

c++ - 是否指定了任何标准类移动后的状态?

如果我移动shared_ptr'a'到shared_ptr'b'是否保证'a'为空?是否指定任何标准类移动后的状态? 最佳答案 如果指定,它在它们的构造函数和(如果可分配的)赋值运算符子句下。对于shared_ptr我们有:§20.7.2.2.1[util.smartptr.shared.const]shared_ptr(shared_ptr&&r)noexcept;templateshared_ptr(shared_ptr&&r)noexcept;p20Remark:Thesecondconstructorshallnotpart

c++ - 为什么在 C++ 中不允许初始化整数成员变量(不是 const static)?

当我尝试在类定义中初始化一个int成员变量时,我的C++编译器报错。它告诉“只能在类中初始化静态常量整数数据成员”。您能否解释此限制背后的基本原理(如果可能,举例说明)。 最佳答案 因为目前的标准是不允许的。AccordingtoBjarne,您将能够在C++0x中执行此操作。如果您确实需要它,请尝试将编译器设置为C++0x(GCC中的-std=c++0x)并查看您的编译器是否支持它。 关于c++-为什么在C++中不允许初始化整数成员变量(不是conststatic)?,我们在Stack