За последние 24 часа нас посетили 17719 программистов и 1723 робота. Сейчас ищут 925 программистов ...

Странное выделение памяти

Тема в разделе "Прочие вопросы по PHP", создана пользователем Scr1pt, 9 июн 2008.

  1. Scr1pt

    Scr1pt Активный пользователь

    С нами с:
    9 июн 2008
    Сообщения:
    5
    Симпатии:
    0
    Пытаюсь уже некоторое время разобраться - как PHP выделяет оперативную память и как ей можно оперировать.

    Появился такой вопрос. Точнее, вопросов и странностей просто море.. ну вот, например:

    PHP:
    1. <?php
    2.  
    3. $mem0 = memory_get_usage();
    4. echo "Script memory: " . ( memory_get_usage() - $mem0 - sizeof( $mem0 ) ). " bytes";
    5.  
    6. ?>
    Результат выполнения кода:

    Код (Text):
    1. Script memory: 55 bytes
    Как так может быть? Откуда взялись эти 55 байт? Такое ощущение, что от меня ускользает что-то настолько нелепое и очевидное.. мне просто стыдно. Если что - не пинайте сильно, просто подтолкните в нужном направлении.. самостоятельно я это направление, видимо, найти не могу :(
     
  2. Anonymous

    Anonymous Guest

    никак.
     
  3. Anonymous

    Anonymous Guest

    сколько весит сам скрипт в памяти? сколько весит переменная $mem0 ?
     
  4. Scr1pt

    Scr1pt Активный пользователь

    С нами с:
    9 июн 2008
    Сообщения:
    5
    Симпатии:
    0
    Как это можно узнать?

    1 байт. Но вроде, я его уже вычел.
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Как она может весит один байт, если это integer?
     
  6. Scr1pt

    Scr1pt Активный пользователь

    С нами с:
    9 июн 2008
    Сообщения:
    5
    Симпатии:
    0
    Ссори.. Только что дошло, что функция sizeof() не возвращает размер переменной :)

    Подскажите тогда, пожалуйста, как можно узнать сколько PHP выделелил памяти под ту или иную переменную? Всмысле, есть ли подобные функции?
     
  7. Anonymous

    Anonymous Guest

    как она может весить один байт, если это zval
     
  8. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Или даже так :)
     
  9. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Размер int на платформе хранится в PHP_INT_SIZE
     
  10. Scr1pt

    Scr1pt Активный пользователь

    С нами с:
    9 июн 2008
    Сообщения:
    5
    Симпатии:
    0
    Эта константа появилась в PHP 5.0.5 (если считать пятую ветку), у меня же - 5.0.0.. Так что мне её не посмотреть :(

    Но int явно не может быть размером в 56 байт! Тогда откуда взялось всё остальное?

    PHP:
    1. <?php
    2.  
    3. $mem0 = memory_get_usage();
    4. echo memory_get_usage() - $mem0;
    5.  
    6. ?>
    Код (Text):
    1. 56
     
  11. Anonymous

    Anonymous Guest

     
  12. Scr1pt

    Scr1pt Активный пользователь

    С нами с:
    9 июн 2008
    Сообщения:
    5
    Симпатии:
    0
    Что это такое? Где можно почитать? И.. почему не простой int?
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. typedef union _zvalue_value {
    2.     long lval;                  /* long value */
    3.     double dval;                /* double value */
    4.     struct {
    5.         char *val;
    6.         int len;
    7.     } str;
    8.     HashTable *ht;              /* hash table value */
    9.     zend_object_value obj;
    10. } zvalue_value;
    11.  
    12.  
    13. struct _zval_struct {
    14.     /* Variable information */
    15.     zvalue_value value;     /* value */
    16.     zend_uint refcount;
    17.     zend_uchar type;    /* active type */
    18.     zend_uchar is_ref;
    19. };