64bitアプリケーション開発におけるsize_t型

x64環境に移って、考えなしにunsigned intでstd::string::find()の戻り値を受け取ったりしていたら、実行時にエラーで躓いたので。

コンパイラはgcc4.6.3、ターゲットはx64です。
x64ではlong型が8bytesに、そしてsize_tはunsigned intではなくunsigned longがtypedefされるんですね。*1

#include <iostream>
#include <typeinfo>

using namespace std;

template<class T>
void show_type_info(){
    cout << "  name: " << typeid(T).name() << endl;
    cout << "  size: " << sizeof(T) << " bytes" << endl;
}

int main(){
    cout << "size_t:" << endl;
    show_type_info<size_t>();

    cout << "unsigned int:" << endl;
    show_type_info<unsigned int>();

    cout << "unsigned long:" << endl;
    show_type_info<unsigned long>();

    string str("Akari daisuki");
    cout << "str.find(\"suki\", 0):" << endl;
    show_type_info<decltype(str.find("suki", 0))>();

    return 0;
}


Output:

size_t:
  name: m
  size: 8 bytes
unsigned int:
  name: j
  size: 4 bytes
unsigned long:
  name: m
  size: 8 bytes
str.find("suki", 0):
  name: m
  size: 8 bytes


どの環境でも大丈夫なように、ちゃんとsize_tかautoを使うことにしようと思います。

*1:ついでに言うとポインタ型も8bytesになります。