开发者

Tables/pointers when using IMAGE_FILE_LARGE_ADDRESS_AWARE 32bit - 64bit

Lets me ask a very specific question: What is the difference (in memory usage) when you have a large array, or large list of the same size (implemented with pointers). e.g

var a:array[1..1000000] of integer;

and

type
  po=^p1;
  p1=record
     v:integer; 
     next:po;
  end;
var p:po;

and you create list with 1000000 integers.

  1. Will the pointer implementation use much more memory than array?
  2. Will the difference will even be larger on 64 bit computers, si开发者_开发问答nce the pointers are 64bits.


x86 bpointers are 4 bytes (32 bits). x64 pointers are 8 bytes (64 bits).

  1. Yes, by the size of a pointer per record (i.e. 1 million times the size of a pointer), plus the size of one initial pointer to the list.
  2. Yes, by at least 4 bytes per record and 4 bytes for the initial record.

At 2., it is a minimum size increase. The actual size increase might be bigger, and depends on how Embarcadero is going to do record packing and field alignment in the x64 world.

--jeroen


The record is 8 bytes in size (on 32 bit Delphi), the array is 4 bytes (* length).

Assuming the size of a pointer is 8 bytes in the upcoming 64 bit Delphi the record would be 12 bytes (if integer remains 4 which I presume).

PS: I think it would be better to declare a large array as dynamic since a dynamic array's memory is allocated on the heap instead of the stack.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜