小编Mar*_*ang的帖子

Linux 包管理器将如何处理 C++20 模块?

现在是 2020 年,C++20 以及期待已久的 C++ 模块功能即将到来。但是在看了一些关于 CppCon 的演讲后,我发现 C++ 模块处于一个奇怪的地方,尤其是对于 Linux 包管理器(pacman、apt、emerge 等...)

据我所知,C++ 模块是

  1. 依赖编译器
    • 您不能在 Clang 中使用由 GCC 构建的模块
    • GCC 9.1 模块不适用于 GCC 9.2
  2. 您可以拥有同一模块的许多不同版本
    • 只要它们不导出到同一范围内
  3. 如果依赖项更新,您需要重建模块

我的问题是,在所有滚动发布发行版中,编译器一直在更新,用户可能有自己的编译器版本。目前可以只更新编译器或更新libstdc++. 但是对于模块,似乎建议libstdc++在编译器更新时必须更新。

当编译器更新时,包管理器将如何处理更新,例如 STL?我不认为为每个版本的编译器构建每个版本的 STL 模块是可行的。用户必须构建自己的 STL 模块也不是一个好主意。

c++ dependency-management package-management c++20 c++-modules

12
推荐指数
1
解决办法
1144
查看次数

使用 Address Sanitizer 编译主机应用程序时可使用 OpenCL

我正在调试 OpenCL 应用程序的崩溃。我试图使用 asan 来确定问题的根源。但是后来我发现打开asan并重新编译后,我的应用程序找不到任何OpenCL设备。简单地添加-fsanitize=address到编译器选项使我的程序无法使用 OpenCL。

通过进一步测试,我发现内存清理器不适用于 OpenCL。

为什么会这样?如何在 OpenCL 中使用 asan?

编辑:一个最小的例子

#include <CL/cl.hpp>
#include <vector>
#include <iostream>

int main() {
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);
    if(platforms.size() == 0) std::cerr << "in asas\n";
    else std::cout << "compiled normally\n";
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

cl::Platform::getCL_SUCCESS 正常返回。获取平台的过程中没有错误。

还有一些关于我的设置的信息。
GPU:GTX 780Ti
驱动程序:418.56
OpenCL SDK:Nvidia OpenCL / POCL 1.3,带 CPU 和 CUDA 后端
编译器:GCC 8.2.1
操作系统:Arch Linux(内核 5.0.7 x64)

c++ debugging opencl address-sanitizer

6
推荐指数
1
解决办法
208
查看次数

C++协程泄漏内存和帧

我正在使用 cppcoro 在 C++ 中试验协程。但是 Address Sanitizer 似乎总是不高兴我正在泄漏内存。为什么?我从来没有使用原始的 new/delete 分配任何东西,也从来没有造成与shared_ptr.

#include <cppcoro/task.hpp>
#include <cppcoro/sync_wait.hpp>
#include <iostream>


class A {
public:
    A() { std::cerr << "A ctor\n"; }
    ~A() { std::cerr << "A dtor\n"; }
};


int main()
{
    auto getACoro = []() -> cppcoro::task<std::shared_ptr<A>> {
        co_return std::make_shared<A>();
    };

    auto foo = [getACoro]() -> cppcoro::task<> {
        co_await getACoro();
        co_return;
    };

    auto coro = [&foo]() -> cppcoro::task<> {
        co_await foo();
    };
    cppcoro::sync_wait(coro());
}
Run Code Online (Sandbox Code Playgroud)

编译: g++ -std=c++20 -focorutines main.cpp -o main …

c++ memory-leaks coroutine c++20 c++-coroutine

5
推荐指数
0
解决办法
264
查看次数

一起使用 cppcoro 和 ASIO 的 co_spawn

我有一个库是使用cppcoro编写的,并希望将它与 ASIO 一起使用。但是每当我尝试co_spawn从所述库中使用协程时。Boost 抱怨 awaitable 类型不正确。

例如:

#include <asio/io_context.hpp>
#include <asio/coroutine.hpp>
#include <asio/co_spawn.hpp>
#include <asio/detached.hpp>
#include <asio/awaitable.hpp>
#include <cppcoro/task.hpp>

cppcoro::task<int> foo()
{
        co_return 1;
}

int main()
{
        asio::io_context ctx;
        asio::co_spawn(ctx, foo(), asio::detached);
        ctx.run();
}
Run Code Online (Sandbox Code Playgroud)

Boost 抱怨cppcoro::task<int>并非源自asio::awaitable

asio_cppcoro.cpp: In function ‘int main()’:
asio_cppcoro.cpp:15:43: error: no matching function for call to ‘co_spawn(asio::io_context&, cppcoro::task<int>, const asio::detached_t&)’
   15 |  asio::co_spawn(ctx, foo(), asio::detached);
      |                                           ^
In file included from /usr/include/asio/co_spawn.hpp:467,
                 from asio_cppcoro.cpp:3:
/usr/include/asio/impl/co_spawn.hpp:199:1: note: candidate: ‘template<class Executor, …
Run Code Online (Sandbox Code Playgroud)

c++ boost-asio asio c++20 c++-coroutine

5
推荐指数
1
解决办法
295
查看次数