質問するログイン新規登録
コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

945閲覧

ポインタのサイズについて

apa

総合スコア73

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2025/09/27 11:33

編集2025/09/28 12:26

0

1

ポインタサイズはコンパイラによって決まる認識で
32bitシステムでbuild >> 4バイト
64bitシステムでbuild >> 8バイト

下記参照
https://af-e.net/c-language-structure-pointer-size/

しかし別にプラットフォームにも依存すると書かれておりました。
これは開発者が64bitでbuildしても別のプラットフォームが4バイトでポインタサイズを決めるという
ことがありうるということなのでしょうか?

またここでいうプラットフォームとはosやplaystationなどの開発機という認識で相似ないでしょうか?

★この部分
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2025/09/28 12:29

いくつも回答いただきありがとうございました 問題の把握と理解が深まったと思います。
guest

回答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\バイナリx86x64arm
x86OKNGNG
x64OKOKNG
armOKOKOK

OSのアーキテクチャーが違っていても、同じバイナリ実行ファイルであれば、ポインターのサイズは同じになります。

投稿2025/09/28 01:57

raccy

総合スコア21816

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2025/09/28 12:28

たしかに本文に追加した★画像部分でbuild前にプラットフォーム固定するので ps4でbuildしたものをps4動作時に動的に切り替える必要がないことが分かりました
guest

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
thkana

総合スコア7769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ポインタのサイズはコンパイラが決めます
実行ファイルが動くか否かは、ハードウェアがそのアーキテクチャに対応しているかで決まります
つまり作成したプログラムがコンピュータによって動的に翻訳される訳ではなく、開発者が事前に仕様を把握した上で設計します
なのでポインタのサイズが自律的に4byteへ変更されることはありません

プラットフォームに依存するとは、設計予定のプログラムに、ハードウェアのスペックによる制約が課されるという意味です

投稿2025/09/27 16:19

nanashi123

総合スコア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
int32_t

総合スコア22013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ポインタのサイズは、ビルドされた時点で決まります。
例えば、Visual StudioでもGCCでも、32bit向けにビルドした実行ファイルを64bit版で動作させても、ポインタのサイズは4byteです。
(逆は、そもそも動かないので関係無い)

投稿2025/09/27 12:06

hiroki-o

総合スコア1642

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問