Thread overview | |||||
---|---|---|---|---|---|
|
June 11, 2015 .sizeof dynamically allocated array | ||||
---|---|---|---|---|
| ||||
import std.stdio; void main() { ubyte[] a1 = new ubyte[65]; ubyte[65] a2; writeln("a1.sizeof = ", a1.sizeof); // prints 16 writeln("a2.sizeof = ", a2.sizeof); // prints 65 } Why a1.sizeof is 16? |
June 11, 2015 Re: .sizeof dynamically allocated array | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adel Mamin | On Thursday, 11 June 2015 at 20:09:38 UTC, Adel Mamin wrote:
> import std.stdio;
>
> void main()
> {
> ubyte[] a1 = new ubyte[65];
> ubyte[65] a2;
>
> writeln("a1.sizeof = ", a1.sizeof); // prints 16
> writeln("a2.sizeof = ", a2.sizeof); // prints 65
> }
>
> Why a1.sizeof is 16?
ubyte[] is a slice, which is actually a struct. It's more or less the same as:
struct Slice(T)
{
T* ptr;
size_t length;
}
So sizeof returns the size of the struct, not the size of the data that its ptr member points to.
ubyte[65] is a static array, which is just a big block of data on the stack. That's why it returns the expected value for sizeof. To create a slice of a static array, use the slice operator:
writeln(sizeof(a2[])); //Prints 16
|
June 11, 2015 Re: .sizeof dynamically allocated array | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adel Mamin | On Thursday, 11 June 2015 at 20:09:38 UTC, Adel Mamin wrote:
> Why a1.sizeof is 16?
sizeof is tied to *type*, not a variable. (I kinda wish a1.sizeof was prohibited, forcing you to say typeof(a1).sizeof so it is clear but whatever).
A dynamic array's size is the length variable plus the pointer variable.
A static array's size is the content itself.
If you want the size of the content in bytes, best way is to do (cast(ubyte[]) a1[]).length or somethign like that - use the length property instead of sizeof.
|
Copyright © 1999-2021 by the D Language Foundation