根据 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_size
,has_hw_interference_sizes
将为0
。
(相反的 bool
逻辑是常见 shell 定义 true
(0)和 false
(非 0)的方式)
只需将其插入您的构建系统即可。
关于c++ - 命名空间 'hardware_constructive_interference_size' 中没有名为 'std' 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67999444/