c++ - 命名空间 'hardware_constructive_interference_size' 中没有名为 'std' 的成员

标签 c++ c++17

根据 cppreference , 要确定 std::hardware_constructive_interference_size 是否可用,它使用以下示例:

#include <new>

#ifdef __cpp_lib_hardware_interference_size
    using std::hardware_constructive_interference_size;
    using std::hardware_destructive_interference_size;
#else
    // 64 bytes on x86-64 │ L1_CACHE_BYTES │ L1_CACHE_SHIFT │ __cacheline_aligned │ ...
    constexpr std::size_t hardware_constructive_interference_size
        = 2 * sizeof(std::max_align_t);
    constexpr std::size_t hardware_destructive_interference_size
        = 2 * sizeof(std::max_align_t);
#endif

但是,我的系统定义了__cpp_lib_hardware_interference_size但是没有符号std::hardware_constructive_interference_size

我该如何处理这种情况?
有没有办法检查一个符号是否被定义?

  • Apple clang 版本 12.0.0 (clang-1200.0.32.29)
    目标:x86_64-apple-darwin19.6.0
    线程模型:posix
    安装目录:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
  • macOS Catalina 10.15.7(MacBook Pro 2019)

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(untitled4)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
if (UNIX AND NOT APPLE)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
endif()

add_executable(untitled4 main.cpp)

最佳答案

How can I handle this situation?

您可以使用预定义的宏检测损坏的语言实现并为其创建异常。

可以通过尝试编译和运行一个小程序来进行检测:

#include <new>

int main() {
#ifdef __cpp_lib_hardware_interference_size
    // return 0 if the interference_sizes are defined
    return !(std::hardware_constructive_interference_size &&
             std::hardware_destructive_interference_size);
#else
    return 1; // no interference_sizes
#endif
}
clang++ -std=c++17 -o hwisize hwisize.cpp 2>/dev/null && ./hwisize
has_hw_interference_sizes=$?
  • 如果编译失败,has_hw_interference_sizes 将为 1
  • 如果编译成功,但未定义__cpp_lib_hardware_interference_size,则has_hw_interference_sizes将为1
  • 如果编译成功,并且定义了 __cpp_lib_hardware_interference_sizehas_hw_interference_sizes 将为 0

(相反的 bool 逻辑是常见 shell 定义 true(0)和 false(非 0)的方式)

只需将其插入您的构建系统即可。

关于c++ - 命名空间 'hardware_constructive_interference_size' 中没有名为 'std' 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67999444/

相关文章:

c++ - 为什么引用 unique_ptr 会这样?

c++ - 套接字缓冲区中烦人的 NUL block

c++ - 如何在 pre-C++11、C++11、14 和 17 中简化复杂的 SFINAE 语法?

c++ - std::tuple::get 返回常量类型&&

c++ - 为什么在 g++4.7.3 中当 const 引用释放到不同类型时内存分配是这样的

c++ - 在嵌套模板结构中将引用类型作为模板参数传递不起作用

时间:2019-03-08 标签:c++TemplatedFunctor

c++ - 这个模板类型推导和重载解析是如何工作的?

c++ - 模板推导指南中的附加类型

c++ - 如何打印使用 "std::any"类型的变量插入的字符串 vector 的元素