首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名称空间'std‘中没有名为'hardware_constructive_interference_size’的成员

名称空间'std‘中没有名为'hardware_constructive_interference_size’的成员
EN

Stack Overflow用户
提问于 2021-06-16 08:57:37
回答 1查看 376关注 0票数 3

根据优先选择,要确定std::hardware_constructive_interference_size是否可用,请使用以下示例:

代码语言:javascript
复制
#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

我该如何处理这种情况?

是否有一种检查符号是否已定义的方法?

  • 苹果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 :InstalledDir
  • macOS Catalina 10.15.7 (MacBook Pro 2019)

CMakeLists.txt

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-16 09:03:39

我该如何处理这种情况?

您可以使用预定义的宏检测中断的语言实现,并对其进行异常处理。

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

代码语言:javascript
复制
#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
}
代码语言:javascript
复制
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)的方式)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67999444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档