命名空间“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
有什么价值?是>= 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'吗?