Sizeof

主にCC++において、sizeofは、データ型の大きさを求める単項演算子である。sizeofは原則としてコンパイル時計算される演算子で、もしくは括弧でくくった型指定子を与えるとその大きさをバイト単位で返す。これは組み込みの数値型(整数型浮動小数点数型)、列挙型ポインタ型、利用者定義の複合データ型(構造体共用体、C++のクラス)まで、ほぼ全てのデータ型に対して使用できる。

必要性

多くのプログラムで、データ型の大きさがわかると便利な状況がある。最もよくある例としては標準Cライブラリmallocなどによる動的メモリ確保が挙げられる。組込型の大きさは処理系定義となっており、厳密な大きさはsizeof (char)1であることを除いて標準に定められていない。次の例では10個の要素を持つint型の配列を格納するのに十分なメモリを確保しようとしている。(処理系に依存したコードを書くつもりでなければ)int型の正確な大きさはわからないのでsizeofが必要となる。

int *pointer; /* intへのポインタ型、メモリ確保したデータを参照する */
pointer = malloc(sizeof (int) * 10);

このコードで、mallocは確保したメモリ領域へのポインタを返すが、その大きさはちょうどint型10個分になる。

一般的に、CとC++で型の大きさを仮定するのは安全でない。標準規格でもchar以外の型がメモリ上で何バイト占めるかを規定していない。たとえば、16ビットシステムでのint型の大きさは通例2バイトであるが、大半の32ビットシステムではint型の大きさは4バイトである。また、構造体や共用体ではアライメントもあり、ますます正確な大きさを求めるのは困難となる。そのようなこともあり、移植性の高いプログラムを書くには型の大きさを求めるためにsizeofを使用することが推奨されている。

CとC++

使用方法

sizeof演算子は、メモリ上に領域を占めるものであれば、ほとんどどんなものに対しても使用できる。sizeofを使うには、キーワードsizeofの後に変数やあるいは括弧でくくった上で型名を書く。変数や式の場合は、括弧でくくるかどうかは自由である。次の例ではint型がchar型の4倍のサイズを持つ実装の場合、1, 4と出力される(なお、char型にsizeof演算子を適用した結果は全ての実装において1でなければならない)。

// C99
char c;
printf("%zu, %zu", sizeof c, sizeof (int));
// Microsoft Visual C++
char c;
printf("%Iu, %Iu", sizeof c, sizeof (int));
// キャスト
char c;
printf("%lu, %lu", (unsigned long) sizeof c, (unsigned long) sizeof (int));

sizeofの結果は実装定義の符号無し整数型であるsize_t型となり、負数になることはない。

sizeofを関数型、ビットフィールド、不完全型(後述)に対して使用することはできない。

なお、printfなどでsize_t型を書式出力する場合、C99で追加された長さ修飾子zを用いる。 C99に対応していない処理系では、引数をキャストするか、処理系依存の修飾子(たとえばMicrosoft Visual C++ならば修飾子I)を用いる。

もし%uを使用すると、size_t型とunsigned int型のサイズが異なる環境において未定義動作となる。

配列に対するsizeof

sizeof配列型に使用されると、その配列がメモリ上に占める大きさが演算結果となる。配列の大きさは、要素の型の大きさに要素数をかけた値と規定されており、例えば要素型Tについてsizeof (T[8])sizeof (T) * 8と同じ値になる。逆に、配列xに対して、sizeof x / sizeof x[0]の演算により、配列の要素数を求めることが可能である。

次の例では、文字の複写時にバッファオーバーランを起こさないよう、sizeofを配列の大きさを求めるために用いている。

/* sizeofを配列に使用する例 */
#include <stdio.h>
#include <string.h>

int main(void)
{
  char buffer[10]; /* 要素数10のchar配列 */

  /* 標準入力から読み取った結果をbufferへ9文字までのみ複写する。
   *(sizeof (char)は常に1なので、sizeof buffer[0]で割る必要はない)
   */
  fgets(buffer, sizeof buffer, stdin);

  puts(buffer);
  return 0;
}

C99可変長配列に対して sizeofを適用する場合、配列の大きさは実行時に動的に計算され、コンパイル時定数にはならない。

sizeofと不完全型

sizeofは完全に定義されたデータ型(メモリレイアウトが確定した型)のみに適用できる。配列なら、要素数が変数宣言に含まれていなければならず、構造体や共用体ならメンバが完全に定義されていなければならない。例えば次の二つのソースファイルがあったとする。

/* file1.c */
int arr[10];
struct x { int one; int two; };
/* file2.c */
extern int arr[];
struct x;

どちらのファイルも正しいCのソースであるものの、"file1.c"ではsizeofarrstruct xに使用できるが、"file2.c"では完全型でないため使用できない。"file2.c"ではarrの要素数がわからず、struct xのメンバも分からないためである。"file2.c"でarrstruct xsizeofで使用できるようにするには、"file2.c"のarrの宣言に要素数を指定したり、struct xの完全な宣言を書いたりする必要がある。

構造体メンバのsizeof

構造体やクラスの非静的メンバに対してsizeofを適用する場合、CおよびC++03規格までのC++では、構造体やクラスのオブジェクト(インスタンス)からメンバにアクセスする式に対して適用しなければならない。

#include <stdio.h>

struct my_type {
    int member1;
    short member2;
};

int main(void) {
    struct my_type obj;
    printf("%u\n", (unsigned)sizeof(obj.member1));
    printf("%u\n", (unsigned)sizeof(obj.member2));
    /* sizeofはコンパイル時に評価されるので、以下のように書いても実行時のNULLデリファレンスは発生しない */
    printf("%u\n", (unsigned)sizeof(((struct my_type*)NULL)->member1));
    printf("%u\n", (unsigned)sizeof(((struct my_type*)NULL)->member2));
    return 0;
}

C++11規格以降では、スコープ解決演算子::を利用して以下のように書けるようになった[1]

#include <cstdio>

struct my_type {
    int member1;
    short member2;
};

int main() {
    printf("%zu\n", sizeof(my_type::member1));
    printf("%zu\n", sizeof(my_type::member2));
}

GCCなど、一部のコンパイラでは、C++03以前でもこの記法を拡張としてサポートしていた。

実装

コンパイラは言語の実装に適合するように、sizeof演算子をデータ型のメモリ上に占める大きさを結果とするように実装しなければならない。また(既述の例外を除いて)これはコンパイル時計算される演算子であり、アセンブリ言語上では単なる即値になる。

構造体のパディング

利用者定義型の大きさはアライメントのためにメンバの大きさの合計よりも大きくなることが規格では許されている。次のコードは多くの環境において8と出力される。

struct student {
    char grade; /* charは1バイト */
    int age /* intは4バイト */
};

printf("%zu", sizeof (struct student));

この理由は、多くのコンパイラでは通常ワード単位にデータを揃えるためであり、個々のメンバも境界を揃えられる。上の場合は、境界調整によってメンバ変数のageが次のワード単位に置かれる。このような構造体には境界調整のためにメンバ間やメンバの後ろに「パディング」と呼ばれる余分な隙間が置かれる。多くのCPUではデータがワード単位のメモリアドレスに置かれていた方が高速に読み書きでき、また中にはワード単位に揃えられていないと読み書きできないCPUもある[2]

D

D言語では全ての型が持っているプロパティとしてsizeofが用意されている。

void main()
{
    writefln(int.sizeof);
}

.NET

.NET Framework/.NET Coreでは、Marshal.SizeOfメソッド[3]によってオブジェクトのアンマネージサイズやアンマネージ型のサイズをバイト単位で取得可能である。.NET 4.5.1でジェネリックバージョンのオーバーロードが追加された。そのほか、各.NET言語に類似の組み込み言語機能が用意されていることがあるが、System.Boolean型に対する演算結果など、必ずしもMarshal.SizeOfと同じ結果になるとは限らない。

C++/CLI

C++/CLIsizeof演算子はネイティブ型(基本型およびポインタ型)に用いる限りコンパイル時定数となり、基本的にC++と同じである。しかし値クラス (value class) 型、(マネージ)ハンドル型やジェネリック型引数に対して用いられたときにはコンパイル時定数でなくなる。また参照クラス (ref class) 型やインターフェイス型に対して用いることはできない(不正となる)[4]

C#

C#sizeof演算子は、アンマネージ型(組み込み型、列挙型、ポインタ型、参照型のフィールドやプロパティを含まないユーザー定義の構造体)のサイズをバイト単位で取得する。結果はint型となる。特定の組み込み型に対してsizeof演算子を用いた場合の結果はコンパイル時定数となるが、それ以外の型に使用した場合はコンパイル時定数とならない。また、sizeof演算子を使用するにはunsafeモードが必要だが、C# 2.0以降は組み込み型に対するsizeofに関してのみunsafeが不要となった[5]

Visual Basic

Visual Basicでは、Len関数などが存在する。Lenは文字列を引数に与えると文字列の長さを返すが、その他の型の変数を与えると変数の大きさを返す。

ActiveBasic

ActiveBasicでは、Visual Basicと同様のLen組込関数を持っているほか、SizeOf組込関数を持っている。Lenは型名を指定することができないが、SizeOfは型名を指定できる。逆にSizeOfに変数や式を指定することはできない。

脚注

関連項目

Read other articles:

Trulek belang Vanellus tricolor Rekaman Status konservasiRisiko rendahIUCN22693967 TaksonomiKerajaanAnimaliaFilumChordataKelasAvesOrdoCharadriiformesFamiliCharadriidaeGenusVanellusSpesiesVanellus tricolor Vieillot, 1818 Tata namaSinonim taksonCharadrius tricolor Vieillot, 1818 Hoplopterus tricolor (Vieillot, 1818) Lobivanellus tricolor (Vieillot, 1818)DistribusiDistribution of the banded lapwing lbs Trulek belang ( Vanellus tricolor ) adalah burung pantai berukuran kecil hingga sedang, ditemu...

 

Ben & JodySutradaraAngga Dwimas SasongkoProduser Cristian Imanuell Chicco Jerikho Rio Dewanto Skenario Angga Dwimas Sasongko M. Nurman Wardi Pemeran Rio Dewanto Chicco Jerikho Penata musikOfel Obaja SetiawanSinematograferArnand PratiktoPenyuntingHendra Adhi SusantoPerusahaanproduksi Visinema Pictures Jagartha Blibli Astro Shaw Tanggal rilis 27 Januari 2022 (2022-01-27) (Indonesia) Durasi114 menitNegaraIndonesiaBahasaBahasa Indonesia Ben & Jody adalah film drama laga Ind...

 

The building, in 2011 The Ark is a historic building on Kirkgate in Tadcaster, a town in North Yorkshire, England. The building was constructed in the late 15th century, and was altered in the 17th century.[1] A tradition claims that the Pilgrim Fathers met at the building, to plan their voyage to the Americas. In 1672, it was known as Morley Hall, and was owned by Robert Morley. He registered it that year as an independent meeting hall for Congregationalists, one of the first to be ...

العلاقات الألمانية الكندية ألمانيا كندا   ألمانيا   كندا تعديل مصدري - تعديل   العلاقات الألمانية الكندية هي العلاقات الثنائية التي تجمع بين ألمانيا وكندا.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولتين: وجه المقارنة ألماني�...

 

Mountain in Nunavut, Canada Barbeau PeakBarbeau Peak as seen from its eastern sideHighest pointElevation2,616 m (8,583 ft)[1]Prominence2,616 m (8,583 ft)[1]ListingHighest ocean islands 37thNorth America prominent peaks 31stNorth America isolated peaks 13thCanada most prominent peaks 11thCanada most isolated peaks 1stCoordinates81°55′36″N 74°59′12″W / 81.92667°N 74.98667°W / 81.92667; -74.98667[1]GeographyBarb...

 

Questa voce sull'argomento stagioni delle società calcistiche italiane è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Voce principale: Associazione Calcio Mestre. Unione Sportiva MestrinaStagione 1950-1951Sport calcio Squadra Mestrina Allenatore Umberto Visentin Presidente Alfonso Allomi Serie C11º posto nel girone B. 1949-1950 1951-1952 Si invita a seguire il modello di voce Questa voce raccog...

Strontium carbonate Names IUPAC name Strontium carbonate Other names Strontianite Identifiers CAS Number 1633-05-2 Y 3D model (JSmol) Interactive image ChemSpider 14666 Y ECHA InfoCard 100.015.131 EC Number 216-643-7 PubChem CID 15407 RTECS number WK8305000 UNII 41YPU4MMCA Y CompTox Dashboard (EPA) DTXSID3029651 InChI InChI=1S/CH2O3.Sr/c2-1(3)4;/h(H2,2,3,4);/q;+2/p-2 YKey: LEDMRZGFZIAGGB-UHFFFAOYSA-L YInChI=1/CH2O3.Sr/c2-1(3)4;/h(H2,2,3,4);/q;+2/p-2Key: LED...

 

Painting by Paolo Veronese Supper at EmmausItalian: Cena in Emmaus, French: Les Pèlerins d'EmmaüsArtistPaolo VeroneseYearcirca 1559–1560[1]Mediumoil on canvasSubjectRoad to Emmaus appearanceDimensions241 cm × 415 cm (7.91 ft × 13.62 ft)LocationLouvre, ParisOwnerGovernment of France Supper at Emmaus (Cena in Emmaus) is a painting by Italian Renaissance artist Paolo Veronese. At the Louvre, where it is housed, it is known as Les Pèlerins ...

 

坐标:43°11′38″N 71°34′21″W / 43.1938516°N 71.5723953°W / 43.1938516; -71.5723953 此條目需要补充更多来源。 (2017年5月21日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:新罕布什尔州 — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源...

Elliptical galaxy in the constellation Virgo Messier 86Galaxy Messier 86 in Virgo, imaged by the Hubble Space TelescopeObservation data (J2000 epoch)ConstellationVirgoRight ascension12h 26m 11.7s[1]Declination+12° 56′ 46″[1]Redshift-0.000814 ± 0.000017 (-244 ± 5 km/s)[1]Distance52 ± 3 Mly (15.9 ± 1.0 Mpc)[2]Apparent magnitude (V)8.9[3]CharacteristicsTypeS0(3)/E3[1]Apparent size (V)8.9′ × 5.8′[1&#...

 

2016年美國總統選舉 ← 2012 2016年11月8日 2020 → 538個選舉人團席位獲勝需270票民意調查投票率55.7%[1][2] ▲ 0.8 %   获提名人 唐納·川普 希拉莉·克林頓 政党 共和黨 民主党 家鄉州 紐約州 紐約州 竞选搭档 迈克·彭斯 蒂姆·凱恩 选举人票 304[3][4][註 1] 227[5] 胜出州/省 30 + 緬-2 20 + DC 民選得票 62,984,828[6] 65,853,514[6]...

 

此條目需要补充更多来源。 (2021年7月4日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:美国众议院 — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 美國眾議院 United States House of Representatives第118届美国国会众议院徽章 众议院旗...

此条目序言章节没有充分总结全文内容要点。 (2019年3月21日)请考虑扩充序言,清晰概述条目所有重點。请在条目的讨论页讨论此问题。 哈萨克斯坦總統哈薩克總統旗現任Қасым-Жомарт Кемелұлы Тоқаев卡瑟姆若马尔特·托卡耶夫自2019年3月20日在任任期7年首任努尔苏丹·纳扎尔巴耶夫设立1990年4月24日(哈薩克蘇維埃社會主義共和國總統) 哈萨克斯坦 哈萨克斯坦政府...

 

Expansions of Liverpool boundaries in 1835, 1895, 1902, 1905 and 1913 The history of Liverpool can be traced back to 1190 when the place was known as 'Liuerpul', possibly meaning a pool or creek with muddy water, though other origins of the name have been suggested. The borough was founded by royal charter in 1207 by King John, made up of only seven streets in the shape of the letter 'H'. Liverpool remained a small settlement until its trade with Ireland and coastal parts of England and Wale...

 

بيتم أب (بالإنجليزية:Beat 'em up وتعني «أبرحهم ضرباً») عنوان اللعبة زينو كلاش من ضمن لعبة بيتم آب. هدف اللعبة ألعاب البيتم أب تركز على مقاتلة اللاعب للعديد من الأعداء من خلال اللكم أو الركل، أو باستخدام السيوف كما في ألعاب الهاك آند سلاش (بالإنجليزية: Hack & Slash) في العديد من المرا�...

Artikel ini bukan mengenai Bajaj. Si BajajGenre Drama Komedi Fantasi Supranatural PembuatMD EntertainmentDitulis olehAviv ElhamSkenarioAviv ElhamSutradara Sachin Kamcakar Khot Trimo Demak Pemeran Ervan Naro Selly Hasan Joanna Ronald Gustav Soraya Abdullah Misye Arsita Boy Tirayoh Vicky Nitinegoro Siti Anizah Ucok Baba Muhammad Rifky Penggubah lagu temaPopo FauzaLagu pembukaSi Bajaj - Joel AchmadLagu penutupSi Bajaj - Joel AchmadPenata musikOya' RezhicoNegara asalIndonesiaBahasa asliBaha...

 

Bagian dari seri tentangGereja KatolikBasilika Santo Petrus, Kota Vatikan Ikhtisar Paus (Fransiskus) Hierarki Sejarah (Lini Masa) Teologi Liturgi Sakramen Maria Latar Belakang Yesus Penyaliban Kebangkitan Kenaikan Gereja Perdana Petrus Paulus Bapa-Bapa Gereja Sejarah Gereja Katolik Sejarah Lembaga Kepausan Konsili Ekumene Magisterium Empat Ciri Gereja Satu Gereja Sejati Suksesi Apostolik Organisasi Takhta Suci Kuria Romawi Dewan Kardinal Konsili Ekumene Lembaga Keuskupan Gereja Latin Gereja-G...

 

Eurovision Song Contest 2016Country Bosnia and HerzegovinaNational selectionSelection processInternal selectionSelection date(s)Artist: 25 November 2015Song: 19 February 2016Selected entrantDalal and Deen feat. Ana Rucner and JalaSelected songLjubav jeSelected songwriter(s)Almir AjanovićJasmin Fazlić JalaFinals performanceSemi-final resultFailed to qualify (11th)Bosnia and Herzegovina in the Eurovision Song Contest ◄2012 • 2016 Bosnia and Herzegovina ...

Irish cyclist David McCannMcCann during the time trial at the 2011 UCI Road World ChampionshipsPersonal informationFull nameDavid McCannBorn (1973-03-17) 17 March 1973 (age 51)Belfast, Northern IrelandHeight1.86 m (6 ft 1 in)Weight73 kg (161 lb)Team informationCurrent teamRetiredDisciplineRoadTrackRoleRiderRider typeTime trialistAmateur team2000Phoenix CC Professional teams2001Ceresit–CCC–Mat2002Volksbank–Ideal2003Team Endurasport.com–Princ...

 

Cet article est une ébauche concernant l’endurance automobile, le sport automobile et une personnalité danoise. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Pour les articles homonymes, voir John Nielsen (homonymie). John Nielsen John Nielsen lors de la victoire à Spa en 2005 Biographie Date de naissance 7 février 1956 (68 ans) Lieu de naissance Varde (Danemark) Nationalité  Danois Carrière ...