ポインタサイズはコンパイラによって決まる認識で
32bitシステムでbuild >> 4バイト
64bitシステムでbuild >> 8バイト
下記参照
https://af-e.net/c-language-structure-pointer-size/
しかし別にプラットフォームにも依存すると書かれておりました。
これは開発者が64bitでbuildしても別のプラットフォームが4バイトでポインタサイズを決めるという
ことがありうるということなのでしょうか?
またここでいうプラットフォームとはosやplaystationなどの開発機という認識で相似ないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
ポインターのサイズはコンパイル時の動作ターゲットのCPUアーキテクチャーによって決まります。プラットフォームというのは、CPUアーキテクチャーとOSの組合せ(正確には、ABIとAPIの組合せ)を言います。
GCC等のコンパイラがCやC++をコンパイルする時、必ず、ある特定のプラットフォームをターゲットにします(デフォルトでは、そのGCCを動かすプラットフォームがターゲットになるので、ほとんどの場合はターゲットを指定しません)。そして、そのプラットフォームでのみ動作するバイナリ実行ファイルを作成するのがコンパイルになります。このバイナリ実行ファイルが動作するプラットフォームは限定されているため、ポインターのサイズも決定されています。バイナリ実行ファイルに依存していますので、このバイナリ実行ファイルが動作する環境であれば、それが実行された際、いつも同じポインターのサイズになります。
さきほど、バイナリ実行ファイルは特定のプラットフォームでしか動作しないと言いました。でも、Windowsにはx86、x64、armの三つのCPUアーキテクチャーがあり、三つのバイナリ実行ファイルが用意されていることも珍しくありません(例えば、RubyInstallerでは、x86、x64、armの三つが用意されている)。注意してほしいのは、CPUによっては複数のCPUアーキテクチャーを切り替える機能を持っていたり、OSによっては別のCPUアーキテクチャー向けのエミュレーターを内蔵したりします。
下は、Windows10/11でのOSのアーキテクチャーとバイナリのアーキテクチャーが動作するかどうかの組合せです。
OS\バイナリ | x86 | x64 | arm |
---|---|---|---|
x86 | OK | NG | NG |
x64 | OK | OK | NG |
arm | OK | OK | OK |
OSのアーキテクチャーが違っていても、同じバイナリ実行ファイルであれば、ポインターのサイズは同じになります。
投稿2025/09/28 01:57
総合スコア21816
0
話の上では、コンパイラで64KBの範囲のメモリしか扱わない「ことにする」ならばポインタを2Byteにすることも可能でしょうし、ポインタになんらかのアトリビュートを組み込むなら(「セグメント」とか、ハーバードアーキテクチャのメモリ空間区別とか)アドレス空間が64KBでもポインタが3Byteの情報を持つ、とかいうことも可能ではあるでしょう。
ただ、現実としては、アプリケーションを動かすプラットフォームを素直に透過させた方が簡単で、そこに小細工をするメリットなんて(教育用とかならともかく)ほとんどないのでしない、結果としてプラットフォームでのアドレス空間のサイズがそのまま見えてくる、ということかと思います。
64bitでbuildしても別のプラットフォームが4バイトでポインタサイズを決める
私の考える"build"では、buildしている時点でプラットフォームは決まっているので、「別のプラットフォーム」が出しゃばってくることはありません。JAVAは?というなら「プラットフォーム」は仮想マシンのレイヤーになるのでしょうし。
あなたの行うbuildでは、後からプラットフォームが差し替えになる例があるのですか?
プラットフォームとはosやplaystationなどの開発機
なんか"os"と"開発機”はレイヤーがあっていない気がしますけれど、いいんじゃないですか。
CPU(モードを持つものであれば使うモード)が一番都合良く処理できるサイズがあって、これが依存元。それを(依存元に矛盾しない範囲で)制限したり拡張したりはできるけれど、都合の良さを活かそうとするとOSはそれをそのまま透過させて、開発機~コンパイラ以下末端まで継承する、ということになりがちなので、ことポインタサイズについてはプラットフォームとはなにか、その範囲を突き詰めることにはあまり意味がない、ということになりそうな気がします。
("相違"ない?)
投稿2025/09/27 23:27
編集2025/09/27 23:36総合スコア7769
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ポインタのサイズはコンパイラが決めます
実行ファイルが動くか否かは、ハードウェアがそのアーキテクチャに対応しているかで決まります
つまり作成したプログラムがコンピュータによって動的に翻訳される訳ではなく、開発者が事前に仕様を把握した上で設計します
なのでポインタのサイズが自律的に4byteへ変更されることはありません
プラットフォームに依存するとは、設計予定のプログラムに、ハードウェアのスペックによる制約が課されるという意味です
投稿2025/09/27 16:19
総合スコア141
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
基本的にはプラットフォーム(CPUとOSなど)で決まっているものです。プラットフォームがサポートしているABIが1つ以上あり、ABIでポインタサイズなどが決まっていて、それに合わせてコンパイラがコードを生成します。
- Intel/AMD の CPU 向けの Windows だと、「32bitレジスタを扱いポインタも32bitのABI」と「64bitレジスタを扱いポインタも64bitのABI」の2つをサポートしています。
- 64bitレジスタを扱うのにポインタだけ32bitというABIが実在します。
- 64bitレジスタを扱うのにポインタだけ128bitというABIが実在します。
投稿2025/09/27 12:45
編集2025/09/27 13:15総合スコア22013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。