私は 32ビット OS しか持っていないので 64ビット OS を持っている人に試してもらいたいことがあります。
次のやつです。
ちなみに私のところでは次のようになりました。
Windows 7 Home Premium 32 ビット OS
Borland C++ 5.5.1 for Win32
⇒ sizeof(char *) = 4, sizeof(int) = 4
Embarcadero C++ 7.20 for Win32
⇒ sizeof(char *) = 4, sizeof(int) = 4
Windows 64ビット OS での依頼
Re: Windows 64ビット OS での依頼
まず前提として、このコードはprintfに渡す書式指定文字列とデータが合っていないので、未定義動作になります。
返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。
それを承知の上で、あえてこの未定義動作を起こすコードを実行してみました。
#include <stdio.h>
int main(void) {
printf("sizeof(char *) = %d, sizeof(int) = %d\n", sizeof(char *), sizeof(int));
return 0;
}
Windows 7 Home Premium Service Pack 1
プロセッサ: Intel(R) Core(TM) i7-4712MQ CPU @ 2.30GHz 2.30GHz
実装メモリ(RAM): 8.00GB
システムの種類: 64ビット オペレーティング システム
実行結果(出力)
g++ (GCC) 4.8.1 Visual C++ 2008 Express Edition
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: Windows 64ビット OS での依頼
まず,オブジェクトのサイズはコンパイル時に決定します。
Win32用のバイナリをWoW64上,つまりは64bit Windowsで動かしても,sizeofの結果は変化しません。
その上で,Windows向けに関しては,
つまり,ILP32/LLP64です。
みけCATさんの書いている未定義動作の件に関しては,過去ログの
http://dixq.net/forum/viewtopic.php?f=3&t=5310
も参考にすると良いかと。
Win32用のバイナリをWoW64上,つまりは64bit Windowsで動かしても,sizeofの結果は変化しません。
その上で,Windows向けに関しては,
- 16bit Windows用
- short/int/near pointer : 2
- long/float/far pointer : 4
- double : 8
- 32bit Windows用
- short : 2
- int/long/float/pointer : 4
- long long/double : 8
- 64bit Windows用
- short : 2
- int/long/float : 4
- long long/double/pointer : 8
つまり,ILP32/LLP64です。
オフトピック
簡単に言うと,WindowsのデファクトであるVisual C++がこの設定であるため。
みけCATさんの書いている未定義動作の件に関しては,過去ログの
http://dixq.net/forum/viewtopic.php?f=3&t=5310
も参考にすると良いかと。
Re: Windows 64ビット OS での依頼
お2人ともどうもありがとうございます。
お2人のコメントを呼んで、こちらの依頼内容が明確ではなかったんだと思いました。
「先のコードの Win64ビット用のバイナリを Win64ビット OS で実行してもらい」
としなければいけなかったんだとわかりました。
みけCATさん、Win32ビット用のバイナリで実行されたのなら意図しないものでした。
わざわざ実施してもらったのに申し訳ないです。
しかし、ILP32 とか LLP64 という単語(?)が出てきたので、そこから知りたかったことにたどり着けました。
お2人のコメントを呼んで、こちらの依頼内容が明確ではなかったんだと思いました。
から、依頼の文面はYuO さんが書きました:まず,オブジェクトのサイズはコンパイル時に決定します。
Win32用のバイナリをWoW64上,つまりは64bit Windowsで動かしても,sizeofの結果は変化しません。
「先のコードの Win64ビット用のバイナリを Win64ビット OS で実行してもらい」
としなければいけなかったんだとわかりました。
みけCATさん、Win32ビット用のバイナリで実行されたのなら意図しないものでした。
わざわざ実施してもらったのに申し訳ないです。
しかし、ILP32 とか LLP64 という単語(?)が出てきたので、そこから知りたかったことにたどり着けました。
オフトピック
(もしかするとまるっきり関係ない話ではないかも...)
sizeof() に関してですが、
そこから、YuOさんに紹介された sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか? を読みました。"%d", "%u" の違いだけが問題はではないんですね。
改めて、
sizeof() に関してですが、
から、「そういえば、sizeof() を知りたてのころは次のようにしてたな」と思い出しました。 でも、「返される値は十分小さいことが予想される」なら "%d" でもいいのではないでしょうか?みけCAT さんが書きました:まず前提として、このコードはprintfに渡す書式指定文字列とデータが合っていないので、未定義動作になります。
返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。
そこから、YuOさんに紹介された sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか? を読みました。"%d", "%u" の違いだけが問題はではないんですね。
改めて、
なるほど。みけCAT さんが書きました:返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。