c++ 相关问题

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

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

如何将二进制字符串转换为base64编码数据

我正在接收字符串中的二进制数据。我想将其编码为 Base64。是否有任何类可以执行该操作(我想要一个 API)。

回答 2 投票 0

QueryDosDeviceW 在线程中调用时始终返回 0

QueryDosDeviceW 返回 0。为什么? 我使用 Visual Studio 2022 (v143) 平台。 以下是测试代码和输出。 #包括 #包括...

回答 1 投票 0

CSES 问题集公寓:请提出解决其余问题的建议

有 n 个申请人,m 个空闲公寓。您的任务是分配公寓,以便尽可能多的申请人获得公寓。 每个申请人都有一个想要的公寓面积,...

c++
回答 1 投票 0

对于 std::ranges::views 结果,使用更明确的类型而不是 auto

auto 非常适合维护单一定义并避免一些输入。这对于 std::ranges::views 也是必要的。然而,auto 会使代码更难阅读,因为它与定义类型相差太远(

回答 1 投票 0

CSES 问题集公寓:请提示解决其余问题

有 n 个申请人,m 个空闲公寓。您的任务是分配公寓,以便尽可能多的申请人获得公寓。 每个申请人都有一个想要的公寓面积,...

c++
回答 1 投票 0

为什么这个运算符重载可以在 MSVC 和 GCC 中编译,但不能在 Clang 中编译?

我正在尝试创建一个strong_alias包装类型,它可以与原始类型互换,但不能与其他strong_alias互换。 #包括 #包括 模板 我正在尝试创建一个 strong_alias 包装类型,它可以与原始类型互换,但不能与其他 strong_aliases 互换。 #include <array> #include <stdint.h> template <typename T, typename tag> requires std::is_arithmetic<T>::value class strong_alias { public: using type = T; constexpr strong_alias() : _value{} { } template <typename other> requires std::is_arithmetic<other>::value constexpr strong_alias(const other &set_value) : _value{T(set_value)} { } constexpr T &value() { return _value; } constexpr const T &value() const { return _value; } template <typename other> requires std::is_arithmetic<other>::value constexpr operator other() const { return other(value()); } constexpr bool operator==(const strong_alias &rhs) const { return value() == rhs.value(); } constexpr strong_alias operator*(const strong_alias &rhs) const { return value() * rhs.value(); } private: T _value; }; using A = strong_alias<int8_t, struct A_tag>; static_assert(std::is_assignable<A, A>()); static_assert(std::is_assignable<A, int>()); static_assert(std::is_assignable<int &, A>()); using B = strong_alias<int8_t, struct B_tag>; static_assert(not std::is_assignable<A, B>()); static_assert(not std::is_assignable<B, A>()); static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang int main() { } 上面的代码可以使用 MSVC (/std:c++latest) 和 GCC (-std=c++2c) 进行编译,但不能使用 Clang (-std=c++2c) 进行编译。 这里有编译器资源管理器演示。 哪些编译器能够正确处理这段代码?在 Clang 下使其工作的首选方法是什么? Compiler Explorer 的 Clang 输出: <source>:61:29: error: use of overloaded operator '*' is ambiguous (with operand types 'A' (aka 'strong_alias<signed char, A_tag>') and 'int') 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ~~~~ ^ ~~ <source>:43:25: note: candidate function 43 | constexpr strong_alias operator*(const strong_alias &rhs) const | ^ <source>:61:29: note: built-in candidate operator*(float, int) 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ^ <source>:61:29: note: built-in candidate operator*(double, int) <source>:61:29: note: built-in candidate operator*(long double, int) <source>:61:29: note: built-in candidate operator*(int, int) [...many lines omitted...] <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned __int128) 1 error generated. Compiler returned: 1 首先,我们应该在重现问题的同时尽可能地简化代码。令人失望的是,OP 似乎没有做出任何尝试这样做。这是最小化版本: #include <type_traits> struct A { A(int set_value) : _value{set_value} { } template <typename other> requires std::is_arithmetic<other>::value operator other() const { return other(_value); } A operator*(const A &rhs) const { return _value * rhs._value; } int _value = 0; }; int main() { (void)(A(3) * -1); } 现在,这个*可以有几种不同的解释方式。它可以是 A::operator*,可通过第二个操作数从 int 到 A 的隐式转换来调用,也可以是内置算术 operator*,可通过第一个操作数的隐式转换来调用操作数从 A 到算术类型(可能第二个操作数也经历到不同算术类型的隐式转换)。 Clang 可以帮助打印出所有候选人。 之所以不明确,是因为当调用operator*时,我们得到了与第一个参数类型的精确匹配以及与第二个参数类型的用户定义转换。当调用内置的 operator*(int, int) 时,我们得到一个用户定义的转换,其第一个参数类型与第二个参数类型完全匹配。所以这两个候选人都不比另一个更好。 叮当是正确的。至于如何编译原始代码,由于问题是由两个候选代码引起的,每个候选代码都可以通过不同的隐式转换实现,因此您的选择基本上是: 提供比所有当前现有候选更好的您自己的重载,例如,一个 operator*,其第一个参数类型为 const strong_alias&,第二个参数类型为算术类型,或者 将 A 的转换构造函数更改为显式,或者 将转换函数 (A::operator other) 更改为显式,或者 以上任意组合 我无法告诉您哪个选项最适合您。这取决于您希望您的类型提供的 API。 GCC 和 MSVC 之所以不认为它含糊不清,可能与他们使用不同的算法来确定哪些内置运算符是候选者有关。在这种特殊情况下,他们只是给出了错误的答案,但更普遍的是,该标准没有就如何在其他可能涉及无限的初始候选者的情况下缩小一组相关内置候选者的范围提供足够的指导。请参阅CWG2844。

回答 1 投票 0

C++ 数组 - 必须有常量值错误

我正在学习合并排序算法,当我复制确切的代码时,我收到一个错误“表达式必须具有常量值”,即使它对讲师来说运行没有问题。我是...

c++
回答 1 投票 0

如何将球面几何转换为椭球几何C++顶点生成

我有一个关于如何在c++中生成椭球体顶点几何的问题。我有以下代码: 球体::球体(const LengthT 半径, const LengthT a, const LengthT b, const LengthT c, , std::uint...

回答 1 投票 0

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