From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: "G.B." Newsgroups: comp.lang.ada Subject: Re: Variant record memory storage question Date: Wed, 1 Aug 2018 20:58:46 +0200 Organization: A noiseless patient Spider Message-ID: References: <6cfb0a23-91d0-4ebe-9291-426280e12913@googlegroups.com> Reply-To: nonlegitur@notmyhomepage.de Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 1 Aug 2018 18:58:47 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="8bef2d7564b7a74c8b6c6775af1e1488"; logging-data="9986"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18OxXF4zglqYjX+RnD2wn/j3wY/rUA9ZS4=" User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 Cancel-Lock: sha1:LjQB60YL1teUENQ9LunHVp3ZBVU= In-Reply-To: <6cfb0a23-91d0-4ebe-9291-426280e12913@googlegroups.com> Content-Language: de-DE Xref: reader02.eternal-september.org comp.lang.ada:54011 Date: 2018-08-01T20:58:46+02:00 List-Id: On 01.08.18 19:38, NiGHTS wrote: > Will the record Variant_Record( Is_Small ) be stored as 1 byte? Or does it act almost like a C union allocating the memory for Variant_Record( Is_Big ) even though it will never morph at run-time? (You could also try pragma Unchecked_Union.) GCC's -gnatRn has hints that will help answer the question. Using defaults for representation, package Rep is type Byte is mod 512; type Some_Large_Array is array (1 .. 1_000) of Byte; type Some_Large_Record is record Data : Some_Large_Array; end record; type Which_One is (Is_Small, Is_Big); type Variant_Record (Option : Which_One) is record case Option is when Is_Small => Var_1 : Byte; -- 1 byte when Is_Big => Var_2 : Some_Large_Record; -- 1000 bytes end case; end record; S : Variant_Record (Is_Small); B : Variant_Record (Is_Big); end Rep; $ gcc -c -x ada -gnatR2 rep.ads Representation information for unit Rep (spec) ---------------------------------------------- for Byte'Object_Size use 16; for Byte'Value_Size use 9; for Byte'Alignment use 2; for Some_Large_Array'Size use 16000; for Some_Large_Array'Alignment use 2; for Some_Large_Array'Component_Size use 16; for Some_Large_Record'Size use 16000; for Some_Large_Record'Alignment use 2; for Some_Large_Record use record Data at 0 range 0 .. 15999; end record; for Which_One'Object_Size use 8; for Which_One'Value_Size use 1; for Which_One'Alignment use 1; for Variant_Record'Object_Size use 16016; for Variant_Record'Value_Size use ??; for Variant_Record'Alignment use 2; for Variant_Record use record Option at 0 range 0 .. 7; Var_1 at 2 range 0 .. 15; Var_2 at 2 range 0 .. 15999; end record; for S'Size use 32; for S'Alignment use 4; for B'Size use 16016; for B'Alignment use 2; -- "HOTDOGS ARE NOT BOOKMARKS" Springfield Elementary teaching staff