LINUX.ORG.RU

Perl на 64-битной системе


0

1

Стоит ядро 2.6.32-5-amd64. Но perl, как я понимаю, оперирует только 32мя битами. Ниже - print массива ссылок на скаляр.

SCALAR(0xe9c168) SCALAR(0xe9c2d0)

Почему указатели 32-х битные, а не 64-х битные?

★★

64х битное ядро может стоять и в 32х битной системе

anonymous ()

А как по SCALAR(0xe9c168) можно определить 32-битный указатель или 64 битный? Или тебя смущает что 0xe9c168 укладывается в 32 бита?

А вообще perl --version

This is perl 5, version 12, subversion 4 (v5.12.4) built for x86_64-linux-gnu-thread-multi

Olegymous ★★ ()

если ты решил, что по «SCALAR(0xe9c168) SCALAR(0xe9c2d0)» можно судить о разрядности указателей, то как же ты не заметил, что на самом деле они 24-битные!!!111

arsi ★★★★★ ()
Ответ на: комментарий от arsi

Смешно, да. Я не только эти указатели видел- и все 32 битные

bk_ ★★ ()
Ответ на: комментарий от bk_

а ты хочешь чтоб там было написано 0x00000000001256ef?

anonymous ()
Ответ на: комментарий от bk_

и, да, с чего ты вообще взял что это число имеет какое-либо отношение к реальному адресу объекта в памяти?

anonymous ()
Ответ на: комментарий от anonymous

Я догадался, что перл обрезает Левые нули при выводе

bk_ ★★ ()

Perl

Perl's memory allocation scheme is a bit convoluted, and more complex than can really be addressed here, but there is one common spot where Perl's memory allocation is unintuitive, and that's for hash keys.

When you have a hash, each entry has a structure that points to the key and the value for that entry. The value is just a pointer to the scalar in the entry, and doesn't take up any special amount of memory. The key structure holds the hash value for the key, the key length, and the key string. (The entry and key structures are separate so perl can potentially share keys across multiple hashes)

The entry structure has three pointers in it, and takes up either 12 or 24 bytes, depending on whether you're on a 32 bit or 64 bit system. Since these structures are of fixed size, perl can keep a big pool of them internally (generally called an arena) so it doesn't have to allocate memory for each one.

The key structure, though, is of variable length because the key string is of variable length, so perl has to ask the system for a memory allocation for each key. The base size of this structure is 8 or 16 bytes (once again, depending on whether you're on a 32 bit or 64 bit system) plus the string length plus two bytes.

Since this memory has to be allocated from the system there's the malloc size-field overhead (4 or 8 bytes) plus the alignment bytes (0 to 7, depending on your system and the key length) that get added on to the chunk perl requests. If the key is only 1 character, and you're on a 32 bit system, the allocation will be 16 bytes. If the key is 7 characters then the allocation is 24 bytes on a 32 bit system. If you're on a 64 bit system the numbers get even larger.


http://search.cpan.org/~nwclark/Devel-Size-0.77/lib/Devel/Size.pm

vtVitus ★★★★★ ()

user@ecm-svn:~$ cat p.pl

#!/usr/bin/perl -w
use strict;
use Devel::Size qw(size total_size);
my $b = '1';
my $b2 = '0xFFFFFFFFFFFFFFFF';
my $b3 = \sub { print "aa";};
print size ($b) . ' ' . size($b2) . ' ' . size($b3) . "\n";
user@ecm-svn:~$ ./p.pl
48 64 24

vtVitus ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.