小编Non*_*yme的帖子

C/C++是否能在最短的执行时间内提供任何保证?

为什么编译器似乎对没有做任何事情并且不消除它们的循环有礼貌?

C标准是否需要循环需要一些时间?

例如,以下代码:

void foo(void) {
    while(1) {
        for(int k = 0; k < 1000000000; ++k);
        printf("Foo\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

运行速度比这个慢:

void foo(void) {
    while(1) {
        for(int k = 0; k < 1000; ++k);
        printf("Foo\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

即使有-O3优化水平.我希望删除允许的空循环,从而在两个代码上获得相同的速度.

"花费的时间"是否应该由编译器保留的副作用?

c c++ compiler-optimization language-lawyer

41
推荐指数
3
解决办法
3072
查看次数

如何在g86上为x86_64启用__fp16类型

__fp16浮点数据类型是一个众所周知的扩展上的ARM处理器特别是所使用的C标准.我想在我的x86_64处理器上运行它们的IEEE版本.虽然我知道他们通常没有这个,但我可以用"无符号短"存储(它们具有相同的对齐要求和存储空间)和(硬件)浮点算法来模拟它们.

有没有办法在gcc中请求?

我认为舍入可能稍微"不正确",但这对我来说没问题.

如果这也适用于C++,那将是理想的.

c c++ x86 gcc half-precision-float

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

非原子类型如何实现std :: atomic_ref?

我想知道如何才能std::atomic_ref有效地实现std::mutex非原子对象(每个对象一个),因为以下属性似乎很难实施:

相对于通过引用同一对象的任何其他atomic_ref施加的原子操作,通过atomic_ref施加到对象的原子操作是原子的。

特别是以下代码:

void set(std::vector<Big> &objs, size_t i, const Big &val) {
    std::atomic_ref RefI{objs[i]};
    RefI.store(val);
}
Run Code Online (Sandbox Code Playgroud)

似乎很难实现,因为std::atomic_ref每次都需要以某种方式进行选择std::mutex(除非这是由相同类型的所有对象共享的大主锁)。

我想念什么吗?还是每个对象都有责任实施std::atomic_ref,因此要么是原子的要么携带一个std::mutex

c++ stdatomic c++20 stdmutex

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

使用 std::lock_guard 数组锁定 std::mutex 数组

我有以下互斥体数组:

std::mutex mtx[5];
Run Code Online (Sandbox Code Playgroud)

我想用 RAII 风格锁定它们:

std::lock_guard<std::mutex> grd[5] { mtx[0], mtx[1], mtx[2], mtx[3], mtx[4] };
Run Code Online (Sandbox Code Playgroud)

虽然上面的代码可以工作,但它并不理想,因为我无法独立于数组的大小(此处为 5)来编写它。

有没有办法做到这一点?我应该使用模板魔法来创建一个std::initializer_list数组吗?(那可能吗?)

我愿意使用std::arraystd::vector代替 C 风格的数组,为了简洁起见,我在这里使用了这些数组。理想情况下,这适用于 C++14,但任何符合最新标准的解决方案都可以。

c++ arrays constructor raii

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