小编NoS*_*tAl的帖子

锁定免费容器和能见度

我已经看到了堆栈的一些无锁实现...我的问题是关于可见性,而不是原子性.例如,无锁堆栈的元素(不是指针)必须至多为64位?我是这么认为的,因为你无法保证知名度.真实示例:可以安全地插入此结构并从无锁容器中删除

struct person
{
   string name;
   uint32_t age;
}
Run Code Online (Sandbox Code Playgroud)

编辑:有些人对这个问题感到困惑.为了解释一下:如果作家把人推到堆栈上,读者就会得到它,是否保证读者看到(记忆可见性)正确的人的内容.

visibility lock-free

10
推荐指数
1
解决办法
531
查看次数

是否保证表现得像假设的&& =运算符?

有时我想做

bool success= true;
success &&= dosmthing1();
success &&= dosmthing2();
success &&= dosmthing3();
if (success)
Run Code Online (Sandbox Code Playgroud)

让我们忽略我可以使用异常...我的问题是它是否由C++标准保证,对我的用例来说&=就像不存在&&=一样?...

编辑:做smthing-s返回布尔

c++ logical-operators

10
推荐指数
2
解决办法
326
查看次数

是原子为std :: atomic <int>

根据一个Channel 9 E2E视频(其中包含Herb Sutter),如果number atomic<int> number++是原子的,则在c ++ 0x中.有人可以确认它是如何在最终的C++ 11标准中(让我们假装它已经完成:)).

atomic c++11

9
推荐指数
2
解决办法
2148
查看次数

可以基于范围的循环工作范围

如果我有范围(一对2迭代器)有一种方法为该使用范围写入"for each"循环,而不是原始数组或容器.

像这样的东西:

auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

c++ foreach c++11

9
推荐指数
1
解决办法
2104
查看次数

Constexpr和SSE内在函数

大多数C++编译器都支持SIMD(SSE/AVX)指令

_mm_cmpeq_epi32
Run Code Online (Sandbox Code Playgroud)

我的问题是这个函数没有标记为constexpr,虽然"语义上"没有理由不使用这个函数,constexpr因为它是一个纯函数.

有什么办法,我可以写我自己的版本(例如)_mm_cmpeq_epi32constexpr

显然我希望运行时的函数使用正确的asm,我知道我可以重新实现具有慢速函数的任何SIMD函数constexpr.

如果你想知道为什么我关心constexprSIMD功能.非constexprness具有传染性,这意味着我的任何使用SIMD功能的功能都不可能constexpr.

c++ sse simd intrinsics constexpr

9
推荐指数
1
解决办法
721
查看次数

为什么C++17/C++20中没有添加synchronized_value?

我对synchronized_value的状态有点困惑,一方面它是在CppCoreGuidelines中建议的,但另一方面它在C++20中不可用,甚至没有boost版本(有一个实验版本)。

注:我知道标准化需要时间,但这篇论文是 2014 年的。

我最担心的是标准化过程中是否发现了一些问题,因此不应使用synchronized_value,这违反了核心准则。

CP.50:定义 amutex及其保护的数据。synchronized_value<T>尽可能使用

原因:对于读者来说,要保护数据以及如何保护数据应该是显而易见的。这减少了锁定错误互斥锁或未锁定互斥锁的可能性。

使用 asynchronized_value<T>确保数据具有互斥体,并且当访问数据时正确的互斥体被锁定。请参阅 WG21 提案以添加synchronized_value到未来的 TS 或 C++ 标准修订版。

c++ multithreading mutex c++17 c++20

9
推荐指数
0
解决办法
1862
查看次数

为什么使用 using 声明编译?

下面的代码编译所有3级主要的编译器没有任何问题(MSVC与接受的无效类似的代码中的错误,但这是无关的我的问题):

#include <iostream>

namespace Z{
    struct Na{
        struct Batman{
            int x=47;
        };
    };
}

int main(){
   using Na = Z::Na;
   return Na::Na::Na::Na::Na::Na::Na::Batman{}.x;
}
Run Code Online (Sandbox Code Playgroud)

这背后是否有任何逻辑,或者它只是一个奇怪的边缘情况,在应用为“正常”用途制定的规则时最终是合法的?

如果我的困惑不清楚:我希望奇怪的行被解析为

  • 许多嵌套的命名空间,例如std::std::std和被拒绝
  • 对构造函数 ( Na::Na)的引用,然后在::Na遇到以下情况时被拒绝

c++ language-lawyer c++20

9
推荐指数
0
解决办法
139
查看次数

O(1) 在 std::ranges::views::iota 中查找/包含

我知道 iota 可能很复杂(例如无限),因此在一般情况下这不容易完成,但在某些情况下应该可以在 O(1) 中进行查找/包含操作。

例如

int main() {
    auto vals = views::iota(10'000'000'000, 100'000'000'000);
    return ranges::find(vals, 74'656'000'000) != vals.end();
}
Run Code Online (Sandbox Code Playgroud)

“无限”运行(进行线性搜索)

显然检查可以在 O(1) 内完成。

有没有办法用 C++ 来实现这种通用方式(即在其他视图上查找/包含需要线性时间,并且当它检测到 iota 时需要 O(1)),或者我需要手动检测传递给我的函数的视图是什么时候有限iota视图并进行>=front <=back检查?

c++ c++20 std-ranges c++23

9
推荐指数
1
解决办法
515
查看次数

有没有办法在Visual Studio中进行Scala编程?

我有VS 2012终极RC,最近我对Scala感兴趣,所以我想知道是否有一种方法(插件)在VS中进行简单的Scala编程?谷歌搜索显示了一些可能的承诺,但这些信息已超过一年.我知道Scala在JVM上运行,但我提到的信息提到了.Net版本.

.net scala visual-studio

8
推荐指数
1
解决办法
7295
查看次数

在移动构造函数中用作arg后,哪些std类型保证为空/ null

我知道shared_ptr,在相同类型的构造函数中用作RVR参数后unique_ptr,weak_ptr保证是空的,但我不知道标准是否为std::我提到的其他类型指定了这个.

请注意,我知道移动后的元素保持有效但未指定的状态,我在这里感兴趣的是指定了哪些类型的状态.

c++ move-semantics c++11 c++14

8
推荐指数
2
解决办法
357
查看次数