首页 > 解决方案 > 命名空间“std”中没有名为“hardware_constructive_interference_size”的成员

问题描述

根据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

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

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)

标签: c++c++17

解决方案


我该如何处理这种情况?

您可以使用预定义的宏来检测损坏的语言实现并对其进行例外处理。

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

#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_sizes1.
  • 如果编译成功,但__cpp_lib_hardware_interference_size未定义,has_hw_interference_sizes则为1.
  • 如果编译成功,并且__cpp_lib_hardware_interference_size被定义,has_hw_interference_sizes将会是0.

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

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


推荐阅读