问题标签 [gcc9]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
357 浏览

c++ - 为什么创建的线程数小于thread-max?

使用此代码:

程序创建 ~32718 线程并抛出异常:

/proc/sys/kernel/threads-max值是62434。有什么问题?为什么我的程序在创建线程期间抛出异常?

0 投票
2 回答
99 浏览

c++ - 有可能陷入 compare_exchange 的循环吗?

考虑这段代码(来自'C++ concurrency in action' [第二版]:第 212 页):

我认为线程一个执行是可能的,pop()并且在执行第一行(加载head)时间切片发生在线程二之后,它正在执行push(T&)。所以现在head原子变量的值不等于old_head并且while-loop 不会中断。
这是正确的 ?

0 投票
1 回答
1166 浏览

gcc - 为什么 /usr/lib64 不在 ld.so 的默认位置?

昨天,我尝试通过从源代码构建将我的 gcc 从版本 8.4.0 升级到 9.3.0,因为可以通过 Ubuntu 的 apt repo 安装的最新版本是 8.4.0。

构建和安装过程都可以,我可以编译任何 c++ 代码,即使包括仅由 gcc-9.3.0 实现的功能。但是,如果我在代码中使用了 c++ STL,我将无法运行我的程序。

通过“ ldd my-program”,我发现了问题。看起来 gcc-9.3.0 将文件libstdc++.so.6.0.28安装到/usr/lib64/,而正式版(gcc-8.4.0)的(libstdc++.so.6.0.25)驻留在/usr/lib/x86_64-linux-gnu/中,所以 ld.so 不能为我的程序加载库。如果我将“/usr/lib64”添加到LD_LIBRARY_PATH环境变量中,它就可以工作。

奇怪的是 /usr/lib64 不是 Kubuntu-18.04.4LTS 的 ld.so 的默认搜索位置之一,还是我错了?

我知道它可以通过使用 LD_LIBRARY_PATH 或将路径添加到 /etc/ld.so.conf 来解决,我只是想知道 /usr/lib64 不是默认路径。

此外,我回顾了构建过程:

为了让目标尽可能接近官方的目标,那些来自Ubuntu的apt repo,在配置之前,我用“ echo | gcc -v -x c -E -”获取了官方gcc-8.4.0目标的所有构建选项,然后将它们应用到自己身上建设如下:

请注意选项“--libdir=/usr/lib”明确设置了目标库的安装路径。 但是文件 libstdc++.so.6.0.28 最终仍然安装到 /usr/lib64 中。

我错过了什么?

任何帮助或提示将不胜感激!

0 投票
2 回答
1318 浏览

c++ - Gcc 无法在 MacOS 10.15.4 Catalina 上运行?

我想再次开始编写 c++ 代码,但我刚刚意识到自制版本gcc无法编译任何 c++、c 甚至 fortran 程序。

例如,我尝试编译以下简单的 hello_world.cpp 程序:

使用

我得到的输出是:

我尝试安装gcc@8,gcc@7和 compile 但我仍然收到相同的消息。

此外,当我尝试使用 编译hello_world.c程序gcc-9hello_world.f90使用gfortran-9.

程序*.c*.cpp编译器分别使用clangclang++编译器。我还了解到这as是一个汇编程序,并且 gcc 可以*.s使用该标志输出文件,gcc -S但我仍然不明白错误消息。

我想我在发布之前用尽了我的 C++ 知识和互联网搜索,所以提前谢谢你!

0 投票
0 回答
66 浏览

c++ - C++17,string + string_view 给出编译错误

根据“Nicolai M. Josuttis”的 C++17 书,应该编译以下代码。

我收到以下错误(为清楚起见进行了编辑)

0 投票
1 回答
44 浏览

c - 同一程序的不同变体中没有性能差异

我复制了 glibc 的二分搜索算法实现,然后对其进行了一些修改以满足我的需要。我决定测试它和我学到的关于 GCC 的其他东西(属性和内置)。代码如下所示:

现在,这个程序运行得很好。当我添加更多代码行时,问题就开始了,例如:

在这种情况下,我希望代码更快,但经过多次测试(数十次测试)后性能没有改变。我还测试了 8 和 1 对齐的程序 - 没有变化。我什至预计 gcc 会抛出错误/警告,因为使用的对齐小于类型大小(在我的情况下 64 位机器,uint_fast16_t 是 8 个字节),但没有。然后是另一个更改,即添加缓存(在 GCC 9 中引入)。我在 for 循环之前添加了以下代码:

性能也没有变化。我发现我的 CPU 可能会在第一次之后自动缓存数组,binary_search所以我消除了for循环并在有和没有缓存线的情况下再次测量了几次,但我也没有注意到性能有任何变化。
更多信息:

  1. 使用 CentOS8 64bit 最新内核
  2. 使用 GCC 9.2.1 20191120
  3. 编译-O3 -Wall -pthread -lanl -Wno-missing-braces -Wmissing-field-initializers,编译期间没有错误/警告
  4. 事情没有优化(检查 asm 输出)

我很确定我不知道某事/我做错了什么。

此处提供完整代码。

0 投票
2 回答
71 浏览

c++ - 强制实例化所有模板类成员函数

在模板类的初始开发过程中,在我编写完整的测试用例之前,我发现我希望能够强制编译器为模板类的每个成员(包括非静态成员)生成代码特定的模板参数集,只是为了确保所有代码至少可以编译。

具体来说,我使用的是 GCC 9(对于其他编译器,我真的不需要这种能力,因为这只是我想在开发过程中暂时实现的东西);及其c++14, c++17,c++2ac++20标准。

例如,我可能会编写以下代码:

而且,鉴于我事先知道可能的模板参数的有限集(比如说intfloat这里),我只想确保它们至少在我工作时编译。

现在我可以做到这一点,这显然不够:

由于mistake1并且mistake2没有生成,因此尽管尝试对非数组类型进行索引访问以及不正确的函数调用,但代码编译得很好。

所以我在开发过程中所做的只是编写调用所有成员函数的代码:

但这会变得很痛苦,特别是当成员函数开始有复杂的副作用或前提条件,或者需要非平凡的参数,或者有非公共成员和尚未开发的朋友时。因此,我想要一种无需显式调用所有内容即可测试编译的方法(理想情况下,我希望能够在添加新成员时完全不修改任何“测试”代码来测试编译)。

所以我的问题是:对于至少 GCC 9,有没有办法强制(可能暂时)编译器为模板类的整个成员集生成代码,给定模板参数?

0 投票
1 回答
271 浏览

c++ - Where can I find the GCC 9 implementation of std::chrono::system_clock::now()?

The chrono system header (/usr/include/c++/9/chrono) declares, but does not define, the static now() functions of its clocks. I also do not see an include that looks relevant. Where are these functions implemented?

0 投票
0 回答
68 浏览

c++ - gcc 9中成员对象指针的偏移量

我以前使用它来根据传入成员对象指针来提取对象成员的 size_t 偏移量。

我使用它作为反射库的一部分来散列两种类型以实现兼容性。IE

出于序列化目的,上述两者是相同的,因此使用 x,y,z 类型的附加元数据和成员名称,我可以为这两种类型生成哈希并检查兼容性。
在 gcc 9 中,由于 constexpr 函数中的 UB,memberOffset 函数现在被破坏了。我正在寻找不调用 UB 或 gcc 9 解决方法的 constexpr 版本。__builtin__offsetof 不采用相同的语法,因此与我已经开发的内容不兼容。

[编辑]

为了增加清晰度,这被用作我编写的元编程库的扩展的一部分。大部分代码与使用成员对象指针等为结构生成序列化和绑定代码有关。因此,该库通常按如下方式使用:

由于代码已经在任何地方都使用了成员对象指针,我希望能够使用现有的内容来提取偏移量,而不是必须通过额外调用 offsetof 来更新每个调用点。

0 投票
2 回答
1636 浏览

c++ - 如何在 Windows 上安装 c++ 20?

我正在使用 Windows 10,目前在我的系统上安装了 gcc8,但问题是#include <execution>无法使用这个版本的 gcc。所以,我想要 gcc 9,但我已经下载了可能有最新 gcc 的 mingw 8(最新版本)。

但是这个版本的 mingw 没有安装程序。我复制了我的驱动程序,但我卡住了我必须添加到我的系统变量的路径。因为,没有 bin,包括丢失的 exes。任何人都可以帮助我吗?