命名空间“std”中没有名为“hardware_constructive_interference_size”的成员

Posted

技术标签:

【中文标题】命名空间“std”中没有名为“hardware_constructive_interference_size”的成员【英文标题】:no member named 'hardware_constructive_interference_size' in namespace 'std' 【发布时间】:2021-06-16 08:57:37 【问题描述】:

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

【问题讨论】:

打印__cpp_lib_hardware_interference_size有什么价值?是&gt;= 201703L吗?在阅读 an old LLVM mail thread 时,我注意到他们非常不愿意将其实际添加到他们的库中,而是考虑向标准委员会写一份缺陷报告。 打印201703。这很奇怪......根据***.com/a/39887282/8176989 的评论,该提案的作者在 Apple Clang 团队工作。 嗯,提案必须来自 somewhere :-) Afaik,gcc 也没有实现这一点。我很惊讶功能测试宏“撒谎”。我的clang++-12(在 linux 上)没有定义那个宏。 【参考方案1】:

我该如何处理这种情况?

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

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

#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))

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

【讨论】:

如何使用预定义的宏检测损坏的语言实现? @김선달 我在答案中添加了一种方法。希望 eerorika 可以接受。 @TedLyngmo 谢谢!很遗憾,语言本身无法处理这个问题。 @김선달 功能测试宏应该足够了,但如果实现中存在缺陷,除了实际测试之外几乎没有什么可以做的。

以上是关于命名空间“std”中没有名为“hardware_constructive_interference_size”的成员的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“std”中没有名为“make_unique”的成员

错误:命名空间“std”中没有名为“remove_cv_t”的模板;你是说'remove_cv'吗?

错误:命名空间“std”中没有名为“enable_if_t”的模板;你是说'enable_if'吗?

命名空间“std”中没有名为“hardware_constructive_interference_size”的成员

c++中命名空间std的函数都有哪些

02C++namespace命名空间