めちゃめちゃ根本的なことなのですがw
(C++で)全ての型のバイト数は必ずビルド時(もっというとコンパイル時)に決定されるのでしょうか?
(つまり、何バイトの整数型、何バイトの浮動小数型、とかいった分類でしかなくなるために、どのOSでも結果的にその部分は互換性が保たれる、ということなのでしょうか?)
それとも、たとえばintが2バイトでも4バイトでも動作するように、コンパイル時には型情報(?)みたいなものが出来るだけで、実際のバイト数は実行時に計算されるのでしょうか?
クラスや構造体がアラインメントに沿うように詰め物をされることとか、sizeofがtemplate内であれこれ使われてる状況を考えると、おそらく必ず前者ではないかと思うのですが…
No.3ベストアンサー
- 回答日時:
> ポインタのバイト数は32ビットだと4バイトで、完璧に64ビット用だと8バイトになって、16ビット用だと2種類はありますよね?
C++の1バイトは8ビットとはかぎりませんので、32ビットでも4バイトになるかどうかは処理系によります。
いわゆる16ビットプロセッサの場合でも、アドレスは16ビット、20ビット、24ビットなどがあります。詰物ビットの存在を考えると、ポインタが32ビットになる可能性も十分あるでしょう。
また、関数へのポインタとオブジェクトへのポインタでサイズが異なるとか、オブジェクトへのポインタであっても型によってサイズが異なるといったこともあり得ます。
> それらは様々なところで別々に配布されてる現状をみると
> それぞれ用に(場合によっては別のコンパイラで)コンパイルしないとダメ、と考えていいのでしょうか?
どこまでの範囲を想定しているのかわかりませんが、ターゲットが異なれば互換性がないと考えるべきです。
ありがとうございます。
確かに言われてみればその通りですね。
とりあえず
>どこまでの範囲を想定しているのかわかりませんが、ターゲットが異なれば互換性がないと考えるべきです。
最も知りたかったことはここなので、助かります。
ただ、他の部分はなるほどと思いましたが
>オブジェクトへのポインタであっても型によってサイズが異なるといったこと
この部分は知りませんでした。
具体的にはどのようなケースが存在するのでしょうか?
No.5
- 回答日時:
> そのケースは、現在普及しているものの総量からいうと、大よそどれくらいの割合になるのでしょうか?
限りなくゼロに近いと思います。
しかし、実際に自分が相手にしなければならない処理系がそのようなものであった場合、世間一般での普及状況がどうであるかは何ら関係ありません。
ですので、特定のひとつまたはいくつかの処理系のことだけを想定しているのであれば、それを明示して質問されたほうがよいと思います。
そうでなければ、遭遇頻度がどんなに低くても、存在する可能性がある以上、同列に扱わなければなりません。
>しかし、実際に自分が相手にしなければならない処理系がそのようなものであった場合、世間一般での普及状況がどうであるかは何ら関係ありません。
おっしゃる通りですね♪
まぁ、私はまだ大筋のプログラムが完成して、「よっしゃ~、じゃ他の稀なケース用にも用意しておくか」という段階にはいっておらず、とりあえずは先にWindowsを中心に(それも、古いOSだとサポートが既にないとか、使い方によってはメモリ的に厳しいのではないかとかいうこともあるので、本当のことを言うとXP以降あたりから推奨というぐらいに、とりあえず限定です)してプログラミングしていって、その中でもだいたい大抵の場合はこれで大丈夫、大よそ完成といえる段階までいったら
他のOS用にまた別途コンパイルも考えたくなることが予想される
(その時の対象までは細かく考えていませんが、それでも全体からみれば全体の7~9割程度の環境で動けばいいというくらいです)
ので、とりあえずは必要ないかもしれないけど、一応その時に楽に対応できればと思うので、念には念をということで色々と突っ込んだところを質問させていただいていますが
今回の件についてはおそらく十分な情報が得られましたので、これで締めとさせていただきます。
重ねて、どうもありがとうございます。
No.4
- 回答日時:
> >オブジェクトへのポインタであっても型によってサイズが異なるといったこと
> この部分は知りませんでした。
> 具体的にはどのようなケースが存在するのでしょうか?
例えば、プロセッサのアーキテクチャでは、アドレスが16ビットのワード単位で割り付けられているけれども、Cコンパイラとしては1バイトを8ビットにしたいような状況を考えてみてください。
short型以上は、プロセッサのアドレスをそのままポインタの値にできますが、char型の場合は、プロセッサのアドレス値に加えて、上位か下位かをしているする情報が必要になります。結果として、char型へのポインタが他の型へのポインタより大きくなる可能性があります。
なるほど、確かにそうですね。
そのケースは、現在普及しているものの総量からいうと、大よそどれくらいの割合になるのでしょうか?
またその場合でも、コンパイルしてしまった後なら、それぞれの型のポインタにsizeofとしてやったときに、必ず一定の値が得られる、ということで大丈夫ですか?
No.2
- 回答日時:
C99では、可変長サイズの配列を使うことができます。
例えば、
int n ;
scanf("%d", &n);
int array[n];
のように、実行時でなければ要素数を決定できない配列があります。
この場合、型のバイト数というか、オブジェクトの型およびバイト数は実行時でなければ決定できません。
これはC99であってC++ではないのですが、C++であってもC99と同様の可変長配列を独自拡張としてサポートしている処理系もあります。
その場合は、C++であっても、オブジェクトの型およびサイズは実行時でなければ決定されません。
「型のサイズ」という意味では微妙ではありますが...
へぇ、C99ではそれがありなんですか。
ありがとうございます♪
あの後一番気になったことがあるのですが
ポインタのバイト数は32ビットだと4バイトで、完璧に64ビット用だと8バイトになって、16ビット用だと2種類はありますよね?
それらは様々なところで別々に配布されてる現状をみると
それぞれ用に(場合によっては別のコンパイラで)コンパイルしないとダメ、と考えていいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 中途・キャリア キラキラネームと採用について 6 2023/03/06 13:27
- カップル・彼氏・彼女 彼氏とのお金事情についてです。 私には今月で1年になる彼氏がいます。 お互い高3で私は全日制、彼は通 4 2023/06/29 01:32
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- 所得・給料・お小遣い 母子支援施設 ひとり暮らしについて 1 2022/05/21 10:33
- 確定申告 確定申告と税金について。 お目通しありがとうございます。 確定申告と税金について質問のです。 今月か 5 2022/04/03 19:45
- その他(悩み相談・人生相談) 高校2年の女子です。 バイトがことごとく上手く行きません。やる気はあるし、無断欠勤もしたことないしバ 5 2022/09/11 14:55
- カップル・彼氏・彼女 好きならば我慢し応援するべきなのか 彼氏は凄くバイトをしています。加えて、一つのことに集中するとそち 2 2022/07/31 16:05
- アルバイト・パート 飲食バイトがきつい 現在大学2年生です。 飲食バイトを数ヶ月前から始めたのですが、最近慣れてきたため 2 2022/10/06 23:10
- アルバイト・パート バイトの面接について客観的な意見が欲しいため質問させてください。 現在、大学2年生で塾講師のバイトに 3 2022/05/19 19:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
C言語でのconstを返す関数
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
コンストラクタでnewを失敗した...
-
Run-Time Check Failure #3とい...
-
ハンドル、アドレス、ポインタ...
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
VBはCを混乱させる?
-
ハンドルはポインタか
-
構造体の中の構造体
-
パスからファイル名を抽出
-
C言語でポインタを使ってピタ...
-
単方向リスト
-
AESのC言語による実装
-
ExcelVBAでのkernel32(64bit)
-
nullポインタを逆参照とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報