为什么编译器似乎对没有做任何事情并且不消除它们的循环有礼貌?
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优化水平.我希望删除允许的空循环,从而在两个代码上获得相同的速度.
"花费的时间"是否应该由编译器保留的副作用?
的__fp16浮点数据类型是一个众所周知的扩展上的ARM处理器特别是所使用的C标准.我想在我的x86_64处理器上运行它们的IEEE版本.虽然我知道他们通常没有这个,但我可以用"无符号短"存储(它们具有相同的对齐要求和存储空间)和(硬件)浮点算法来模拟它们.
有没有办法在gcc中请求?
我认为舍入可能稍微"不正确",但这对我来说没问题.
如果这也适用于C++,那将是理想的.
我想知道如何才能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?
我有以下互斥体数组:
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::array或std::vector代替 C 风格的数组,为了简洁起见,我在这里使用了这些数组。理想情况下,这适用于 C++14,但任何符合最新标准的解决方案都可以。