草庐IT

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

开启https://en.cppreference.com/w/cpp/utility/hash它说从C++17开始Eachstandardlibraryheaderthatdeclaresthetemplatestd::hashprovidesenabledspecializationsofstd::hashforstd::nullptr_tandallcv-unqualifiedarithmetictypes(includinganyextendedintegertypes),allenumerationtypes,andallpointertypes.所以,一个C++17兼容的编

c++ - GCC 的 "vstring"是什么?

我阅读了一些GCC错误报告,那里的人在谈论“vstring”。上网搜索发现http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.有人可以详细说明它的用途和用途吗?为什么要使用它而不是std::string? 最佳答案 GCC的vstring是一个通用的字符串类,在GCC4.1的libstdc++中引入实现。兼容std::basic_string,以及这些额外的细节:提供了两个基类:默认的避免引用计数,并针对短字符串进行了优化;

c++ - GCC 的 "vstring"是什么?

我阅读了一些GCC错误报告,那里的人在谈论“vstring”。上网搜索发现http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.有人可以详细说明它的用途和用途吗?为什么要使用它而不是std::string? 最佳答案 GCC的vstring是一个通用的字符串类,在GCC4.1的libstdc++中引入实现。兼容std::basic_string,以及这些额外的细节:提供了两个基类:默认的避免引用计数,并针对短字符串进行了优化;

c++ - 为什么虚拟表中有两个虚拟析构函数,非虚拟函数的地址在哪里(gcc4.6.3)

我实现了一个简单的测试来检查派生类的内存等级,所以我发现派生类的虚拟表中有两个虚拟析构函数地址。谁能给我解释一下?代码:#include#include#includeusingnamespacestd;classBase1{public:Base1():a(1){}virtual~Base1(){cout我找到了f()andf2()结果如下:~Derive~Base2~Base1~Derive~Base2~Base1是派生类的析构函数。为什么有两个?还有一个问题:非虚成员函数的地址在哪里?我发现派生类的内存中不存在非虚函数地址。它在哪里? 最佳答案

c++ - 为什么虚拟表中有两个虚拟析构函数,非虚拟函数的地址在哪里(gcc4.6.3)

我实现了一个简单的测试来检查派生类的内存等级,所以我发现派生类的虚拟表中有两个虚拟析构函数地址。谁能给我解释一下?代码:#include#include#includeusingnamespacestd;classBase1{public:Base1():a(1){}virtual~Base1(){cout我找到了f()andf2()结果如下:~Derive~Base2~Base1~Derive~Base2~Base1是派生类的析构函数。为什么有两个?还有一个问题:非虚成员函数的地址在哪里?我发现派生类的内存中不存在非虚函数地址。它在哪里? 最佳答案

c++ - 标准库容器在 GCC 中生成大量右值拷贝

我正在为linux和windows编写一个应用程序,并注意到GCC构建对复制构造函数产生了很多无用的调用。这是产生这种行为的示例代码:structA{A(){std::coutvec_a(3);}这个测试只创建一个包含3个元素的vector。我期望3个默认构造函数调用和0个拷贝,因为没有A左值。在VisualC++2010中,输出为:defaultmovedefaultmovedefaultmove在GCC4.4.0(MinGW)中,(-O2-std=c++0x),输出为:defaultcopycopycopy发生了什么,我该如何解决?实际类(class)的拷贝很昂贵,默认构造和移动很

c++ - 标准库容器在 GCC 中生成大量右值拷贝

我正在为linux和windows编写一个应用程序,并注意到GCC构建对复制构造函数产生了很多无用的调用。这是产生这种行为的示例代码:structA{A(){std::coutvec_a(3);}这个测试只创建一个包含3个元素的vector。我期望3个默认构造函数调用和0个拷贝,因为没有A左值。在VisualC++2010中,输出为:defaultmovedefaultmovedefaultmove在GCC4.4.0(MinGW)中,(-O2-std=c++0x),输出为:defaultcopycopycopy发生了什么,我该如何解决?实际类(class)的拷贝很昂贵,默认构造和移动很

c++ - 检测二进制文件的 GCC 编译时标志

有没有办法找出特定二进制文件编译时使用的gcc标志? 最佳答案 快速浏览GCC文档并没有发现任何问题。Boost家伙是最聪明的C++开发人员,他们resort命名conventions因为这通常是不可能的(毕竟,可执行文件可以用任意数量的语言,由任意数量的编译器版本创建)。(后来添加):TurnsoutGCChasthisfeaturein4.3ifaskedforwhenyoucompilethecode:Anewcommand-lineswitch-frecord-gcc-switches...causesthecommandl

c++ - 检测二进制文件的 GCC 编译时标志

有没有办法找出特定二进制文件编译时使用的gcc标志? 最佳答案 快速浏览GCC文档并没有发现任何问题。Boost家伙是最聪明的C++开发人员,他们resort命名conventions因为这通常是不可能的(毕竟,可执行文件可以用任意数量的语言,由任意数量的编译器版本创建)。(后来添加):TurnsoutGCChasthisfeaturein4.3ifaskedforwhenyoucompilethecode:Anewcommand-lineswitch-frecord-gcc-switches...causesthecommandl

c++ - 如何在 ubuntu 上将 gcc 编译器更改为 c++11

我使用的是ubuntu12.04,默认的gcc是4.6.3。它不接受c++11命令,并且给我输出说该命令不兼容c++98。我在网上查了一下,看到有人建议不要更改操作系统上的默认编译器,因为它变得不稳定。任何人都可以建议修复或安全的方式来下载符合c++11的gcc编译器。 最佳答案 正如其他人所建议的,您需要输入std命令行选项。让我们轻松为您服务按Ctrl+Alt+T打开终端sudogedit~/.bashrc输入下一行作为最后一行aliasg++="g++--std=c++0x"保存并关闭文件并关闭终端。现在再次打开终端,只需通过