g ++是GNU编译器集合(gcc)的C ++前端。
所以,我想使用一些 GNU C++ 原生的头文件: #包括 #包括 我读到在 MacOS 中,gcc 和 g++ 都是链接的......
为什么 GCC 会将这个向量构造函数的参数转发给所包含类型的构造函数,而 Clang 却不会?
考虑以下虚拟类型: 结构体Foo{ Foo(int x) : x{x}{} 模板 Foo(R r) : x{std::accumulate(r.begin(), r.end(), 0, [](int x, const auto& foo){return x ...
当尝试编译打印“Hello World!”的源代码时使用 std::cout 编译器失败。 我有这个你好世界源代码 #包括 使用命名空间 std; 在...
好的,所以我有 tmp.cpp: #包括 int main() { std::to_string(0); 返回0; } 但是当我尝试编译时我得到: $ g++ tmp.cpp -o tmp tmp.cpp:在函数‘int main()’中: TM...
std::atexit 函数在 MSVC 编译器中不起作用吗?
我想在退出程序时运行一个带参数且返回值为void的函数。我使用以下代码来实现它: #包括 #包括 使用
致命错误:使用 x86_64-w64-mingw32-gcc 时无法执行 cc1 execvp”
我正在尝试使用以下命令编译文件: x86_64-w64-mingw32-gcc反向.cpp -o反向.exe -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-con...
我有一些非常基本的代码,我认为不会导致问题: #包括 ... mat4x4 m = mat4x4(1.0f); m = 旋转(m, (浮动) glfwGetTime(), vec3(0.0f, 0.0f, 1.0f)); 我...
我对 g++ 和 clang++ 进行了测试,并在今天早些时候编写一些单元测试时经历了这一点,并得出了 MWE: #定义 EXPECT_EQ(A, B) 模板 C类{
我有一个 makefile 来制作一个包含 2 个源文件和一个标头的项目。 .PHONY:干净删除运行 CC = g++ CFLAGS = -g -墙 CXXFLAGS = $(CFLAGS) SRC = /home/user/dev/nCPrograms/Flagger/src/theclass...
SDL2/_real_SDL_config.h:没有这样的文件或目录
我一直在尝试在 WSL (Ubuntu) 上设置 SDL2 并使用 cmake 和 mingw 交叉编译到 Windows。我遇到了这个问题,尝试编译库文件本身失败: 在文件中
我正在编写以下模板化向量类。 矢量.h: #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H 模板 类 Vector2D; 模板 我正在编写以下模板化向量类。 向量.h: #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D; template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v); template<class Scalar> class Vector2D { public: Vector2D(); Vector2D(Scalar a, Scalar b); Scalar getX(); Scalar getY(); Vector2D<Scalar> operator+(Scalar a); friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); private: Scalar x, y; }; #endif 向量.cpp: #include<headers/vectors.h> template<class Scalar> Vector2D<Scalar>::Vector2D() { x = 0; y = 0; } template<class Scalar> Vector2D<Scalar>::Vector2D(Scalar a, Scalar b) { x = a; y = b; } template<class Scalar> Scalar Vector2D<Scalar>::getX() { return x; } template<class Scalar> Scalar Vector2D<Scalar>::getY() { return y; } template<class Scalar> Vector2D<Scalar> Vector2D<Scalar>::operator+(Scalar a) { return Vector2D<Scalar>(a + x, a + y); } template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v) { return Vector2D<Scalar>(a + v.x, a + v.y); } template class Vector2D<float>; template Vector2D<float> operator+<float>(float a, Vector2D<float> v); 主要.cpp: #include<headers/vectors.h> #include<iostream> int main(int argc, char* argv[]){ Vector2D<float> a(1.0, 3.0); std::cout<<a.getX()<<" "<<a.getY()<<std::endl; a = (float)2.0 + a; std::cout<<a.getX()<<" "<<a.getY()<<std::endl; a = a + (float)-2.0; std::cout<<a.getX()<<" "<<a.getY()<<std::endl; return 0; } 当我尝试在 Windows 上使用 g++ 编译它时,出现以下错误: g++ -Iinclude -Iinclude/SDL2 -Iinclude/headers -Llib -o Main src/*.cpp -lmingw32 -lSDL2main -lSDL2 -lSDL2_image In file included from src/Main.cpp:2: include/headers/vectors.h:29:33: error: declaration of 'operator+' as non-function 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^~~~~~~~ include/headers/vectors.h:29:41: error: expected ';' at end of member declaration 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ | ; include/headers/vectors.h:29:43: error: expected unqualified-id before '<' token 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ In file included from src/vectors.cpp:1: include/headers/vectors.h:29:33: error: declaration of 'operator+' as non-function 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^~~~~~~~ include/headers/vectors.h:29:41: error: expected ';' at end of member declaration 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ | ; include/headers/vectors.h:29:43: error: expected unqualified-id before '<' token 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ src/vectors.cpp:70:18: error: non-class, non-variable partial specialization 'operator+<Scalar>' is not allowed 70 | Vector2D<Scalar> operator+<Scalar>(Scalar a, Vector2D<Scalar> v) { | ^~~~~~~~~~~~~~~~~ src/vectors.cpp: In instantiation of 'Vector2D<Scalar> operator+(Scalar, Vector2D<Scalar>) [with Scalar = float]': src/vectors.cpp:96:69: required from here src/vectors.cpp:71:35: error: 'float Vector2D<float>::x' is private within this context 71 | return Vector2D<Scalar>(a + v.x, a + v.y); | ~~^ include/headers/vectors.h:37:16: note: declared private here 37 | Scalar x, y; | ^ src/vectors.cpp:71:44: error: 'float Vector2D<float>::y' is private within this context 71 | return Vector2D<Scalar>(a + v.x, a + v.y); | ~~^ include/headers/vectors.h:37:19: note: declared private here 37 | Scalar x, y; | ^ mingw32-make: *** [MakeFile:2: all] Error 1 但是,如果我更改 vectors.h 中 + 运算符声明的顺序,如下所示,它将正常工作。 #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D; template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v); template<class Scalar> class Vector2D { public: Vector2D(); Vector2D(Scalar a, Scalar b); Scalar getX(); Scalar getY(); friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); Vector2D<Scalar> operator+(Scalar a); private: Scalar x, y; }; 我完全不知道为什么会发生这种情况。 我尝试删除模板,问题消失了,所以它一定是相关的。 一般来说,模板函数的定义不应放在单独的 .cpp 文件中。相反,它们应该在模板中的 .h 文件中定义。这个答案消除了 .cpp 文件。 这避免了到处不断重复template< typename Scalar >的麻烦。更重要的是,它允许编译器自动内联它们。 此外,operator+还有一个习惯用法,即首先定义operator+=,然后将operator+实现为隐藏好友,从而调用operator+=。见下文。 // vectors.h #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D { Scalar x{}; // default member-initialization sets x to 0 Scalar y{}; // default member-initialization sets y to 0 public: Vector2D() = default; Vector2D(Scalar a, Scalar b) : x{ a } // use base-member initization, rather than assignment. , y{ b } {} Scalar getX() const // "getter" function declared with const { return x; } Scalar getY() const // "getter" function declared with const { return y; } // Compound assignment operator returns a reference to `this` object. // Within its definition, class template `Vector2D` does not need // a template argument. Avoid `Vector2D<Scalar>`. Vector2D& operator+= (Vector2D const& v) { x += v.x; y += v.y; return *this; } // Use hidden friend idiom to define `operator+`. // Left operand is a value parameter. friend Vector2D operator+ (Vector2D a, Vector2D const& b) { return a += b; } // As before, compound assignment operator returns a reference to // `this` object. Within its definition, class template `Vector2D` // does not need a template argument. Avoid `Vector2D<Scalar>`. Vector2D& operator+= (Scalar a) { x += a; y += a; return *this; } // Provide two versions of `operator+` for Scalar operand. // That way, the Scalar can appear on either side of the `+` sign. // Once again, these are hidden friends. // The vector is passed by value. friend Vector2D operator+ (Scalar const a, Vector2D v) { return v += a; } friend Vector2D operator+ (Vector2D v, Scalar const a) { return v += a; } }; #endif // end file: vectors.h 输出 文件main.cpp与OP相比没有变化。 1 3 3 5 1 3
当我尝试使用 g++ 进行编译并且使用 macOS 时,我收到有关构造函数的错误:没有匹配的构造函数用于初始化[关闭]
我有一个完全正常的代码(一个 cpp 和一个 cpp 文件)和一个 makefile,但是当我尝试用 g++ 编译它时,我得到这个: g++ -std=c++11 -c subject.cpp -o subject.o 在主题包含的文件中......
为什么 g++ 即使使用 C++11 也无法识别 stoi?
我在C++11中有这个函数: 布尔 ccc(常量字符串 cc) { 矢量数字; 国际辅助; for(int n = 0; n < cc.length(); ++n) { digits.push_back(to_string(cc[n])); } ...
我有一个完全正常的代码(一个 cpp 和一个 cpp 文件)和一个 makefile,但是当我尝试用 g++ 编译它时,我得到这个: g++ -std=c++11 -c subject.cpp -o subject.o 在主题包含的文件中......
我已将代码简化为以下示例,该示例在我的 g++ (x64 12.3) 上进行 -O3 C++20 编译失败,并且在使用 godbolt 时显然在 14.1 上失败: 再次根据 godbolt 的说法,clang 无需 ...
有以下代码: #包括 使用命名空间 std; 名称空间 { int funkcja() { 计算<< "unnamed" << endl; return 0; } } int funkcja(...
我有一个使用 cmake 构建的项目。该项目在一个目录中创建一个库 (.a),然后应用程序(来自另一个目录)链接到该库中。它使用 GCC 作为com...
tl;博士;传递给函数的引用与 nullptr 初始化指针具有相同的地址。每个引用都作为 nullptr 传递吗? 使用 g++ 和 gedit(无 IDE)在 Ubuntu (Ubuntu 22.04.4 LTS) 上工作,使用 f...
我已经完全安装并运行了 vcpkg(安装在 C:/vcpkg 中),并且安装了我想要使用的库,在本例中为 cppzmq/zmq (ZeroMQ)。 头文件和 .lib 文件位于 C:/
我尝试使用 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 缓存之间移动。