size_t在C++中的性能

Performance of size_t in C++

本文关键字:性能 C++ size      更新时间:2023-10-16

我将这里的代码翻译成C++,如下

#include <iostream>
using namespace std;
int t = 20;
bool is_evenly_divisible(const int a, const int b) {
    for (int i=2; i<=b; ++i) { // Line 1
        if (a%i != 0)
            return false;
    }
    return true;
}
void run() {
    int i = 10;
    while (!is_evenly_divisible(i, t)) {
        i += 2;
    }
    cout << i << endl;
}
int main(int argc, char** argv) {
    run();
    return 0;
}

使用Mac OSX 10.8.4上编译器g++4.8.1上的-O3标志,我获得0.568s的用户时间。

现在,如果我将函数is_evenly_disible中第1行的计数器I更改为size_t,时间会突然跳到1.588s。即使我将所有变量更改为size_t,时间也会增加到1.646s

发生了什么事?size_t不是应该提高性能而不是降低性能吗?因为它是一个比int更具体的类型?

int通常是最快的全能类型。这个属性不是标准强制要求的,但对于今天的平台来说通常是这样。我们还有一些东西,比如cstil力的int_fast32_t,它被更恰当地保证是最快的类型,可以容纳至少32位——强烈推荐它们用于性能敏感的代码!

size_t不打算给出一个快速整数。它的目的是提供一个整数,该整数可以容纳平台地址空间所能包含的最大大小对象的大小。通常,size_t相当于CPU支持的最大"本机"整数,但它不一定是.

我猜你是在64位平台上。通常,对于32位和64位操作,64位平台的性能大致相等,但有一点是它们通常不一样的:div/mod在64位整数上实际上可能慢2-3倍。在这种情况下,如果int是32位,而size_t是64位,则可以很好地解释这个问题。

有关更多信息,请参阅Agner Fog的说明表文档。对于英特尔的SandyBridge平台,它显示32位div的延迟为20-28个周期,而64位div需要30-94个周期。

Size_t的大小是由实现定义的,如果您运行的是64位机器,大多数编译器都会将其设置为8字节长。

使用8字节整数的操作通常比使用4字节模拟的操作慢。