ストリーミング寺子屋

音声・動画のストリーミング機能を
開発するエンジニアのための
実践的なナレッジベース

【開発環境ほか 1-9】C/C++言語で、64bit環境上で動作するプログラムを作る際の技術的な注意点はありますか?

注意が必要なケース

一般的な変数の使い方をしている場合は問題になることはありませんが、以下のようなケースでは問題が発生する可能性があります。

  1. 通信プロトコルの送受信データやデバイスのレジスタ・アクセス等、データサイズ/位置が厳密に定義されているケースにおいてint/long等のデータモデルによってサイズが変わる型を利用した構造体定義を利用している場合
  2. ポインタ演算をポインタ型以外の変数(int等)を利用してオフセット計算している場合
  3. size_t型などで指定するC標準ライブラリ引数/返却値にint等を利用している場合

64bitバイナリの実行に対応したOS環境

64bitバイナリの実行に対応したOS環境は、一般的には64bitのWindows/Linux等があげられ、組込み向けにも対応した64bit OSが提供されているケースがあります。これらのOS上で動作するアプリケーションのソフトウェア開発では、64bit開発環境を利用することで、64bitバイナリが動作するようになります。

データモデル

64bit開発環境は大きくLLP64、ILP64、LP64のデータモデルが存在し、OSや利用するCPU、 開発環境毎にデータモデルが異なります。以下に代表的なデータモデルを示します。

  • LP32       :intのサイズが16bit (あまり存在しない)
  • ILP32      :一般的な32bit環境
  • LLP64      :ポインタのみ64bit (Windows環境)
  • LP64       :long変数/ポインタが64bit (Linux等UNIX系環境)
  • ILP64      :int/long/pointerが64bit
変数型のサイズ

これらの64bit環境と32bit環境のデータモデルに対応する場合は、それぞれの変数型のサイズを注意する必要があります。特に32bit環境で作成したソフトウェアを64bit環境へ移植する場合は、従来から利用されている変数の型(char/int/short/long/long longやfloat/double/long double等)のサイズが意図したサイズとなっているかを確認する必要があります。

表1は、Windows(Visual Studio)とLinux(GCC)上の32bit開発環境および64bit開発環境における変数型のサイズを示しています。赤文字で記載されている箇所が32bit環境と64bit環境でサイズ変更がある変数型です。

C99では整数型変数としてサイズを指定した型定義が追加定義されました。これらを使用することで、32bit環境と64bit環境での型サイズの違いを防止することが可能となり、それぞれのデータモデルにおいて変数のサイズに統一性が期待できます。C99で追加定義された型定義名称を表2に示します。

新規にソフトウェア開発を行う場合は、積極的にサイズ固定型の変数を利用することで32bit環境および64bitの各データモデルへの対応が容易となります。

また、ポインタの演算を整数型変数で実施する場合は、ポインタサイズと連動して変数サイズが変化する“intptr_t”型を利用することで安全にポインタ演算を行うことが可能になります。

型定義 Windows (Visual Studio) Linux (GCC)
32bit (ILP32) 64bit (LLP64) 32bit (ILP32) 64bit (LLP64)
bool 8bit 8bit 8bit 8bit
char (unsigned char) 8bit 8bit 8bit 8bit
short (unsigned short) 16bit 16bit 16bit 16bit
int (unsignedint) 32bit 32bit 32bit 32bit
long (unsigned long) 32bit 32bit 32bit 64bit
long long (unsigned long long) 64bit 64bit 64bit 64bit
float 32bit 32bit 32bit 32bit
double 64bit 64bit 64bit 64bit
long double 64bit 64bit 96bit 128bit
size-t 32bit 64bit 32bit 64bit
ポインタ 32bit 64bit 32bit 64bit
表1:データモデルによる変数サイズ変化
型定義32bit環境64bit環境
int8_t(unit8_t)8bit8bit
int16_t(unit16_t)16bit16bit
int32_t(unit32_t)32bit32bit
int64_t(unit64_t)64bit64bit
intptr_t32bit64bit
表2:C99の型変数

Q&A

製品情報