根据优先选择,要确定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)发布于 2021-06-16 09:03:39
我该如何处理这种情况?
您可以使用预定义的宏检测中断的语言实现,并对其进行异常处理。
可以通过尝试编译和运行一个小程序来进行检测:
#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_size,则has_hw_interference_sizes将是0。(反向bool逻辑是常见的shell定义true (0)和false (而不是0)的方式)
只需将其插入您的构建系统。
https://stackoverflow.com/questions/67999444
复制相似问题