可変長配列

プログラミングにおいて、可変長配列(かへんちょうはいれつ、英語: variable-length array: VLA)とは、コンパイル時ではなく実行時に長さが決定される自動記憶期間英語版配列データ構造である[1]

VLAに対応しているプログラミング言語には、AdaALGOL 68(行は固定)、APLC99(ただしC11ではサポート必須ではなくオプションに格下げとなった[2][3]。VLAが文法として許されなかったC99以前のC言語では、alloca()関数[4]あるいは類似の関数で同等の機能を実装することがあった)、C#(unsafeモードのスタック割り当て配列として)、COBOLFortran 90J言語がある。また、Object Pascal(Borland Delphiで使用される言語)でも対応している。

メモリ

割り当て

C言語規格はスタック領域ヒープ領域の使い分けを規定しないが、多くの処理系では静的変数はスタック領域から、動的確保のメモリはヒープ領域から確保する[5]。VLAは動的に確保されるものだが、例えばGNU Cコンパイラのように、スタック上に確保する処理系も少なくない[6]

C言語規格においては、静的配列と同様にsizeof演算子によってVLAのバイト容量を得られることが定められているため [7]、VLAの上限はsizeof演算子の返り値の上限であるSIZE_MAXバイトに制限されることになる[8]

ただしこれは文法上の制限に過ぎず、VLAを必須とするC99に準拠する処理系であってもSIZE_MAXバイトまでのVLAを確保できる保証は無い。 ヒープ領域がギガバイトサイズの環境ではSIZE_MAXもギガバイト単位となることが多いので、ギガバイトサイズのVLAが文法上は許される。しかしそのような環境でも、個別の関数の実行にあたって用意されるスタック領域は数MiB程度の場合が多い[9]。VLAをスタック領域に確保する処理系であれば、巨大なVLAの確保はスタックオーバーフローを起こす。 malloc()のような動的メモリ確保はその失敗を戻り値によって知ることができるが、静的配列・VLAとも配列の確保の失敗はセグメント破壊のシグナル[10]などで検知するしかない。従って、単一スコープ内でmalloc()とfree()を繰り返すような処理であっても、それらを全てVLAで書き換えられるとは限らない。

変数アクセス

いくつかのプログラミング言語では、ポインタを介してVLAにアクセスすることができるが、不完全な型と見なされるため、デリファレンス(間接参照)されるとサイズを取得できなくなる[11]

次のC99の関数は、指定されたサイズの可変長配列を割り当て、浮動小数点の値で埋めて、別の関数に渡す。配列は自動変数として宣言されているため、read_and_process() から戻るとその存続期間が終了する。

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(n, vals);
}

C99では、関数呼び出しにおける長さのパラメータは、可変長配列のパラメータよりも前に来なければならない[1]

以下はAdaにおける同じ例である。Adaの配列は境界を持っている。従って、長さをProcess関数に渡す必要はない。

type Vals_Type is array (Positive range <>) of Float;

function Read_And_Process (N : Integer) return Float is
   Vals : Vals_Type (1 .. N);
begin
   for I in 1 .. N loop
      Vals (I) := Read_Val;
   end loop;
   return Process (Vals);
end Read_And_Process;

Fortran 90での同等の関数は次の通りである(コンパイル時にプロシージャ・インターフェイスを検査するFortran 90の機能を利用する場合)。

function read_and_process(n) result(o)
    integer,intent(in)::n
    real::o

    real,dimension(n)::vals
    integer::i

    do i = 1,n
       vals(i) = read_val()
    end do
    o = process(vals)
end function read_and_process

一方、関数がFortran 90以前の呼び出しインターフェイスを使用する場合は、まず(外部)関数を宣言し、配列の長さを引数として明示的に渡す必要がある(Cの場合と同様)。

function read_and_process(n) result(o)
    integer,intent(in)::n
    real::o

    real,dimension(n)::vals
    real::read_val, process
    integer::i

    do i = 1,n
       vals(i) = read_val()
    end do
    o = process(vals,n)
end function read_and_process

次のCOBOLのコード断片は、PEOPLE-CNT値で指定された長さ(メンバー数)を持つレコードの可変長配列DEPT-PERSONを宣言する。

DATA DIVISION.
WORKING-STORAGE SECTION.
01  DEPT-PEOPLE.
    05  PEOPLE-CNT          PIC S9(4) BINARY.
    05  DEPT-PERSON         OCCURS 0 TO 20 TIMES DEPENDING ON PEOPLE-CNT.
        10  PERSON-NAME     PIC X(20).
        10  PERSON-WAGE     PIC S9(7)V99 PACKED-DECIMAL.

次のC#のコード断片は、整数型の可変長配列を宣言する。unsafeというキーワードは、このコードを含むアセンブリが「安全でない」(unsafe) とマークされることを必要とする[注釈 1]

unsafe void declareStackBasedArray(int size)
{
    int *pArray = stackalloc int[size];
    pArray[0] = 123;
}

動的割り当てと自動割り当て

Java.NET Frameworkなどの言語は、可変長配列を提供するとはみなされない。これらの言語では、全ての配列オブジェクトは論理的にヒープに割り当てられ、配列に関して自動記憶期間というものを持たないためである(JavaとdotNetのコンパイラは、これらのヒープ割り当てを可能な限りスタック上に実際に配置するよう最適化できる)。

脚注

注釈

  1. ^ より具体的にいうと、アセンブリのコンパイルオプションに "/unsafe" を追加する必要がある。

出典

  1. ^ a b Variable Length Arrays”. 2017年9月21日閲覧。
  2. ^ Variable Length - Using the GNU Compiler Collection (GCC)”. 2017年9月21日閲覧。
  3. ^ ISO 9899:2011 Programming Languages - C 6.7.6.2 4
  4. ^ スタック領域から動的にメモリを確保する関数。POSIX標準とはならなかったが、古くから様々なUnixシステムのCライブラリで提供されてきた。SunOS 4.1.3のman allocaUltrix 4.2のman alloca2.10 BSDのman allocaRedHat Linux 4.2のman allocaVisual Studio 2015マニュアルの_alloca()などを参照。
  5. ^ 2つのメモリ領域の特性の違いはそれぞれの項を参照。関数ブロックスコープに閉じた変数には、ガベージコレクタが不要で確保・解放が高速なスタック領域を用いる言語が多い。
  6. ^ Code Gen Options - The GNU Fortran Compiler”. 2017年9月21日閲覧。
  7. ^ ISO/IEC 9899:2011 §6.5.3.4 第2条参照。JTC1/SC22/WG14 N1570: ISO/IEC 9899:201x Committee Draft (2011-04-11) 2023年2月20日閲覧。これに対して、malloc()の戻り値ポインタにsizeof演算子を適用してもポインタ変数のバイト数しか得られない。
  8. ^ ISO/IEC 9899:2011 §7.20.3 第2条参照。
  9. ^ コールスタックの脚注3, 4を参照。
  10. ^ ISO/IEC 9899:2011 §7.14.1 参照。
  11. ^ sizeof Operator”. 2017年9月21日閲覧。

Read other articles:

Sapi wagyū Wagyu (和牛code: ja is deprecated , Wagyū, sapi Jepang) mengacu pada beberapa ras sapi dari Jepang. Satu ras di antaranya memiliki kecenderungan genetik berupa pemarmeran (marbling) tinggi dan memproduksi lemak tak jenuh berminyak dalam jumlah besar. Sapi wagyu terkenal karena pola marmer pada dagingnya dan kualitasnya. Daging jenis ini umumnya dijual mahal. Di beberapa daerah di Jepang, daging diberi nama sesuai wilayah produksinya, contohnya daging Kobe, Mishima, Matsusaka, �...

 

Часть серии статей о Холокосте Идеология и политика Расовая гигиена · Расовый антисемитизм · Нацистская расовая политика · Нюрнбергские расовые законы Шоа Лагеря смерти Белжец · Дахау · Майданек · Малый Тростенец · Маутхаузен ·&...

 

Menur Clerodendrum chinense bunga dewasa dan kuncup bunga Melati SusunIlustrasi botani dari Melati SusunStatus konservasiRisiko rendahIUCN158690618 TaksonomiDivisiTracheophytaSubdivisiSpermatophytesKladAngiospermaeKladmesangiospermsKladeudicotsKladcore eudicotsKladasteridsKladlamiidsOrdoLamialesFamiliLamiaceaeSubfamiliAjugoideaeGenusClerodendrumSpesiesClerodendrum chinense Mabb., 1989 Tata namaBasionimCryptanthus chinensis (en) Sinonim takson Daftar Agricolaea fragrans (Vent.) Schrank Clerode...

Pewarna makanan Pewarna makanan merupakan zat aditif yang digunakan untuk meningkatkan penampilan makanan segar dan olahan. Tujuan pemberian warna dimaksudkan agar makanan terlihat lebih berwarna sehingga, menarik perhatian konsumen. Aditif warna adalah komponen penting dari banyak produk, membuatnya menarik, menarik, menggugah selera, dan informatif.[1] Bahan pewarna umumnya berwujud cair dan bubuk yang larut di air. Bahan pewarna termasuk pewarna alami, terutama berasal dari sumber ...

 

Approach to social philosophy Critical sociology redirects here. For the journal, see Critical Sociology (journal). Not to be confused with Critical thinking. Part of a series onSociology History Outline Index Key themes Society Globalization Human behavior Human environmental impact Identity Industrial revolutions 3 / 4 / 5 Social complexity Social construct Social environment Social equality Social equity Social power Social stratification Social structure Perspectives Conflict theory Criti...

 

County park in Wisconsin (US) Cherney Maribel Caves County ParkCherney Maribel Caves County ParkLocation of Cherney Maribel Caves County Park in WisconsinShow map of WisconsinCherney Maribel Caves County Park (the United States)Show map of the United StatesLocationManitowoc, Wisconsin, United StatesCoordinates44°17′12.0474″N 87°46′30.3708″W / 44.286679833°N 87.775103000°W / 44.286679833; -87.775103000Area75 acres (30 ha)Established1963Governing bo...

Questa voce o sezione sull'argomento film sentimentali non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. Questa voce sugli argomenti film drammatici e film sentimentali è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. ...

 

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

 

Transit operator in Fredericton, New Brunswick, CanadaFredericton TransitHeadquarters470 St. Mary's St.LocaleFredericton, NBService areaurban areaService typebus service, paratransitRoutes12HubsKings Place (Main)Regent MallCorbett CenterFleet28 busesWebsitewww.frederictontransit.ca Fredericton Transit (or the City of Fredericton Transit Division) is a small transit operator in Canada owned by the city of Fredericton, New Brunswick. It also includes Dial-A-Bus service for people with disabilit...

Public park in Manhattan, New York Battery Park redirects here. For other uses, see Battery Park (disambiguation). The BatteryBattery ParkAerial view of the Battery in 2010. At park's left is Pier A, at park's right is South Ferry Terminal. On the far right is the East River.LocationSouthern tip of Manhattan Island in New York City; bounded by New York Harbor to the southCoordinates40°42′13″N 74°00′58″W / 40.70361°N 74.01611°W / 40.70361; -74.01611Area25 ac...

 

1985 studio album by Rocío BanquellsRocío BanquellsStudio album by Rocío BanquellsReleased1985 (1985)Recorded1985GenrePopLabelWEARocío Banquells chronology Rocío Banquells(1985) Con él(1986) Rocío Banquells is the 1st studio album by Mexican pop singer Rocío Banquells. This album was released on 1985. History The album debut of the great Mexican singer Rocío Banquells. The album includes songs as Este hombre no se toca, Luna Mágica and Abrázame. The album is considered...

 

Questa voce sull'argomento centri abitati del Baden-Württemberg è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Warthausencomune Warthausen – Veduta LocalizzazioneStato Germania Land Baden-Württemberg DistrettoTubinga CircondarioBiberach TerritorioCoordinate48°07′36″N 9°47′45″E / 48.126667°N 9.795833°E48.126667; 9.795833 (Warthausen)Coordinate: 48°07′36″N 9°47′45″E / 48.126667°N 9....

AltneulandCopertina della 1ª edizione AutoreTheodor Herzl 1ª ed. originale1902 Genereromanzo Sottogenereutopia Lingua originaletedesco AmbientazionePalestina, Terra di Israele Modifica dati su Wikidata · Manuale Altneuland (traduzione: L'Antica Nuova Terra; in yiddish: אַלטנײַלאַנד Altnayland; nella prima edizione in ebraico תֵּל־אָבִיב‎? Tel Aviv, la collina della primavera) è un romanzo utopico scritto da Theodor Herzl, iniziatore del movimento sio...

 

American politician (born 1976) Leslie Rutledge21st Lieutenant Governor of ArkansasIncumbentAssumed office January 10, 2023GovernorSarah Huckabee SandersPreceded byTim Griffin56th Attorney General of ArkansasIn officeJanuary 13, 2015 – January 10, 2023GovernorAsa HutchinsonPreceded byDustin McDanielSucceeded byTim Griffin Personal detailsBornLeslie Carol Rutledge (1976-06-09) June 9, 1976 (age 48)Southside, Independence County, Arkansas, U.S.Political partyRepublicanSpouse...

 

Swiss Protestant theologian (1504–1575) Bullinger redirects here. For the surname, see Bullinger (surname). Heinrich BullingerPortrait by Hans Asper, c. 1550Born18 July 1504Bremgarten (Aargau), Canton of Aargau, Old Swiss ConfederacyDied17 September 1575(1575-09-17) (aged 71)Zürich, Canton of Zürich, Old Swiss ConfederacyNationalitySwissOccupation(s)Theologian, antistesSpouseAnna AdlischwylerParent(s)Heinrich Bullinger and Anna WiederkehrTheological workEraRenaissanceTradition or mov...

Koin Arverni dengan nama Vercingetorix. Arverni adalah salah satu dari 54 suku Galia yang hidup di wilayah Auvergne dari abad ke-7 SM hingga abad ke-1 SM. Nama Auvergne sendiri berasal dari suku ini. Mereka menguasai sumber daya emas, perak, dan perunggu. Mereka terampil dalam bidang metalurgi dan kerajinan. Arverni merupakan salah satu suku Galia terkaya. Paling tidak terdapat empat oppidum Arverni besar yang mendominasi wilayah tempat mereka tinggal. Arverni membentuk konfederasi yang kuat ...

 

Extinct order of reptiles IchthyopterygiansTemporal range: Early Triassic - Late Cretaceous 251.3–90 Ma PreꞒ Ꞓ O S D C P T J K Pg N Utatsusaurus Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Reptilia Clade: †Ichthyosauriformes Superorder: †IchthyopterygiaOwen, 1840 Subgroups See text. Ichthyopterygia (fish flippers) was a designation introduced by Sir Richard Owen in 1840 to designate the Jurassic ichthyosaurs that were known at the time,...

 

萨利纳斯Salinas市镇萨利纳斯在巴西的位置坐标:16°07′07″S 42°10′27″W / 16.11853°S 42.17403°W / -16.11853; -42.17403国家巴西州米纳斯吉拉斯州面积 • 总计1,891.33 平方公里(730.25 平方英里)海拔471 公尺(1,545 英尺)人口 • 總計37,370人 • 密度19.8人/平方公里(51.2人/平方英里) 萨利纳斯(葡萄牙语:Salinas)是巴西米纳斯吉�...

拉阿魯哇族Hla'alua聖貝祭總人口約477人(2024年5月)[1]分佈地區主要居住於高雄市桃源區桃源里與高中里;另少數族群居住於那瑪夏區瑪雅里[2]語言拉阿魯哇語、布農語、中華民國國語宗教信仰十二貝神相关族群 鄒族、卡那卡那富族、布農族 屬於臺灣南島民族 拉阿魯哇族於高雄市桃源區(綠色)與那瑪夏區(藍色)之分布 拉阿魯哇族(拉阿魯哇語:Hla'alua,國際音�...

 

This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Zálesie, Kežmarok District – news · newspapers · books · scholar · JSTOR (July 2021) (Learn how and when to remove this message) Location of Kežmarok District in the Nitra region Zálesie (Slovak pronunciation: [ˈzaːlesɪe], Hungarian: Gibely, German: Giebel, Rusyn:...