c++ 相关问题

C ++是一种通用编程语言。它最初被设计为C的扩展,并保持类似的语法,但现在是一种完全不同的语言。使用此标记来查询有关使用C ++编译器编译的代码的问题。对特定标准版本[C ++ 11],[C ++ 17]等相关问题使用版本特定标记。

C++ GoogleTest INSTANTIATE_TEST_SUITE_P 生成测试用例的序列号

如何在 INSTANTIATE_TEST_SUITE_P ::testing::Values 中有效地使用 C++generate/generat_n/iota 来生成带有测试用例序列号的输入参数?

回答 1 投票 0

正确理解`CopyAssignable`

当我使用stl时,我发现不可分配的类型不允许作为容器的组件。 但是 CopyAssignable 概念确实很难掌握/理解,这需要深入研究

回答 1 投票 0

在 C++ 项目中使用 openmp 时没有观察到加速

我尝试将并行执行添加到我的 C++ 项目中。 因此,基于这个例子,我定义了我的 app.cpp 如下: #包括 #包括 #包括 int sum_s...

回答 1 投票 0

访问通过 new() 分配的内存时出现分段错误(核心转储)

当尝试检查已通过 new() 初始化的值时,我会出现分段错误错误。 int main() { const char* const *matrix = new(char*); std::cout << matrix[0][0]; //

c++
回答 1 投票 0

重新声明变量会导致计算错误

我正在寻找 VS Pro 2022 编译的旧 C++ Win32 程序中的计算错误。 发现该问题是由以下代码引起的,该代码始终产生零结果: 双

回答 1 投票 0

WSAGetLastError 返回 0

我正在使用winsock2的套接字创建一个项目 我使用系统调用连接到本地 IP 地址上的套接字,然后实现了一个用于错误处理目的的简单方法。 // 客户端 整数

回答 1 投票 0

调试模板实例化

使用 C++ 模板进行元编程时,是否可以使用一种类似于调试器的方法来逐步了解模板的实例化和编译方式?看来是对的...

回答 4 投票 0

使用 tgbot-cpp 的项目无法构建?

我在尝试使用 CMake 在 Windows 上构建 C++ 项目时遇到链接器错误。该项目使用 tgbot-cpp 库进行 Telegram 机器人开发。尽管尝试了各种解决方案,我...

回答 1 投票 0

C++ 如何提取和使用“可变参数”模板参数及其类型?

我如何提取和使用 C++ 类的变量模板参数中定义的类型,而不是定义以下类的多个重复项,这些重复项仅延迟数量和...

回答 1 投票 0

如何在MinGW中使用Windows API?

如何在MinGW中使用Windows API?

回答 4 投票 0

难以理解洪水填充算法中的代码行

我指的是youtube上的floodfill算法,我遇到了某行代码。 我不明白标记的代码行的作用。 我尝试在谷歌上搜索但找不到解决方案......

回答 1 投票 0

C++ 如何提取和使用可变模板参数及其类型?

我如何提取和使用 C++ 类的变量模板参数中定义的类型,而不是定义以下类的多个重复项,这些重复项仅延迟数量和...

回答 1 投票 0

OpenMP for 循环比串行代码花费更多时间

我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25 倍的时间才能完成程序。有什么不对的吗?我该如何优化它? #包括 我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25X 时间才能完成程序。有什么不对的吗?我该如何优化它? #include <iostream> #include <cmath> #include <random> #include <chrono> #include <cstdlib> #include <omp.h> using namespace std; int main() { unsigned long long black_square = 1, digit_square = 13; //auto n = ((black_square)<<11) * static_cast<unsigned long long>(pow(digit_square,10)); auto n = static_cast<unsigned long long>(1e9); srand(0); int tmp = 0; std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() std::uniform_int_distribution<> distrib(1, 6); auto tStart = std::chrono::high_resolution_clock::now(); //#pragma omp parallel for schedule(static) reduction(+:tmp) #pragma omp parallel for schedule(static) reduction(+:tmp) num_threads(8) for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==rand()%6))%static_cast<int>(1e9); //for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==distrib(gen)))%static_cast<int>(1e9); tmp%=static_cast<int>(1e9); auto tEnd = std::chrono::high_resolution_clock::now(); cout << tmp << " obtained after " << n << " iterations in " << (tEnd-tStart).count()/1e9 << "s." << endl; return 0; } 代码由g++ -o a.out -O3 -std=c++11 -fopenmp tmp.cpp编译,其中g++的版本为8.5.0 20210514。操作系统是RHEL8.9,有20个Intel Xeon CPUs at 2.593GHz。 串行代码平均运行时间为7.4s,而并行代码平均运行时间为180s。选项 -O3、-O2、-O1 具有相似的结果。随机生成器mt19937可以显着缩小性能差距,但并行代码仍然比串行版本慢得多。增加或减少 n 也会导致类似的结果。 rand()函数不需要是线程安全的。因此,像您所做的那样同时从多个线程调用它是不安全的 glibc 的 rand() 版本是线程安全的,但它是通过将整个函数包装在互斥体中来实现的。因此一次只有一个线程可以调用 rand()。由于在 rand 调用之外,您的代码执行的操作非常少,几乎所有执行时间都将在 rand() 内。 所以并行版本并不是真正的并行。每次调用 rand() 时,每个线程轮流一次执行一个。所以它比单线程没有优势。但实际上更糟糕的是,因为线程必须争夺谁获得互斥锁,在每次调用后唤醒和睡眠,并在每个 CPU 核心的缓存之间移动 PRNG 状态。所以比单线程差很多。 您应该做的是创建多个 PRNG 实例。有一个 gen 对象数组,每个线程一个。每个线程应该使用自己的 PRNG。确保每个对象在内存中相距足够远,不会共享缓存行,因此 PRNG 状态不需要在 CPU 缓存之间移动。

回答 1 投票 0


C++ 从 VT_DISPATCH 类型的 SafeArray 获取 IDispatch 指针

我在从 VT_DISPATCH 类型的 SAFEARRAY 确定有效的 IDispatch 指针时遇到问题。 什么是正确的做法? 到目前为止,我的经验是,在尝试 AddR 时我总是遇到异常...

回答 1 投票 0

c++ 如何获取当前控制台 conhost 进程

在“如何获取conhost进程”之后,我在很多网站上进行了搜索,但没有什么是我真正想要的。 我已经搜索过。 超级用户/stackoverflow when-is-conhost-exe-actually-

回答 3 投票 0

Mingw32 std::isnan 与 -ffast-math

我正在使用 -ffast-math 选项编译以下代码: #包括 #包括 #包括 int main() { std::cout << std::isnan(std::numeric_...

回答 2 投票 0

在不同机器上执行时出现错误“std::system_error”

我尝试了一个在第 12 代 Intel(R) Core(TM) i7-1265U 上使用线程的 cpp 程序,在 Intel(R) Xeon(R) Silver 4216 上运行的容器上尝试相同的程序时没有出现任何错误CPU @ 2.10GHz ...

回答 1 投票 0

在C++中,static_cast<float>(some_double_variable)的标准行为是什么?

除了精度损失之外,当双精度型转换为浮点型时还必须发生某种特殊的转换行为(例如夹紧等)。我试图找到 C++ 标准

回答 1 投票 0

恢复应用程序时 glUseProgram 中的 GL_INVALID_VALUE

我在 glUseProgram(mYUVProgram) 处收到 GL_INVALID_VALUE, 0x0501 错误;在下面的代码中。它发生在恢复应用程序时。根据 glUseProgram 文档 如果出现以下情况,则会生成 GL_INVALID_VALUE: ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.