小编J. *_*Doe的帖子

为什么编译器在循环中从内存加载此指针

我试图确定std::atomic在我的系统(八核x64)上无条件内存写入的开销.这是我的基准程序:

#include <atomic>
#include <iostream>
#include <omp.h>

int main() {
    std::atomic_int foo(0); // VERSION 1
    //volatile int foo = 0; // VERSION 2

    #pragma omp parallel
    for (unsigned int i = 0; i < 10000000; ++i) {
        foo.store(i, std::memory_order_relaxed); // VERSION 1
        //foo = i; // VERSION 2
    }

    std::cout << foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

该程序将按原样进行基准测试std::atomic_int,并对标记VERSION 1的行进行注释并取消注释标记的VERSION 2行将volatile int在其位置进行测试.即使不同步,两个程序的输出也应为10000000 - 1.

这是我的命令行:

g++ -O2 -std=c++11 -fopenmp test.c++
Run Code Online (Sandbox Code Playgroud)

atomic_int在我的系统上使用的版本需要2到3秒,而使用的版本volatile …

c++ performance multithreading atomic openmp

12
推荐指数
1
解决办法
282
查看次数

`unique_ptr`的原子操作

std::shared_ptr atomic_compare_exchange_weak和家人一样的原子操作的专业,但我找不到有关等效专业的文档std::unique_ptr.有吗?如果没有,为什么不呢?

c++ multithreading smart-pointers atomic thread-safety

11
推荐指数
3
解决办法
5091
查看次数

使用临时数组作为左值

该计划格式不正确:

struct X { int i; };

int main() {
    (X { }).i = 1;
}
Run Code Online (Sandbox Code Playgroud)

i,临时的子对象X { },不能用作左值,因为它 X { }是一个右值.

但是,这默默地编译了GCC 5.2.1和-Wall:

using Y = int[10];

int main() {
    (Y { })[0] = 1;
}
Run Code Online (Sandbox Code Playgroud)

如果编译器是正确的,那么这次,(Y { })作为子对象的第0个元素(Y { })可以被视为左值.

我的问题是:

  1. 第二个项目是否格局不正确?
  2. 为什么(不),即使两个程序似乎都将临时的子对象视为左值?

c++ language-lawyer c++11 c++14

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

Map,每个输入元素可以对应多个输出元素

作为haskell的新手,我想知道更有效的方法是:

mapmulti :: (a -> [b]) -> [a] -> [b]
mapmulti fn list = concat $ map fn list
Run Code Online (Sandbox Code Playgroud)

我的列表将长达数千到数百万个元素,创建一个N列表列表只是为了将它们连接在一起似乎是一种耻辱.

或者并且优选地,是否存在一些更通用(可能是monadic)的方式让haskell从函数的结果中逐步创建列表,以便逐步构建列表而不创建O(n)要评估的大小的递归表达式树?

monads haskell list

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