Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размещение переменных в стеке, Размеры не соответствуют размеру типов 
V
    Опции темы
FiMa1
Дата 10.5.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Пытаюсь проанализировать размещение переменных в стеке... Почему разница между адресами переменных a и b равна 12 ?
Код
#include <iostream>
using namespace std;

void func( int p1, int& p2 )
{
    int a, b=3;

    cout << "size of int: " << '\t' << sizeof(int) << endl;
    cout << "size of char: " << '\t' << sizeof(char) << endl;

    cout << "p1 address:" << "\t" << &p1 << " value is " << p1 << endl;
    cout << "p2 address " << "\t" << &p2 << " value is " << p2 << endl;

    cout << "a address:" << "\t" << &a << " not initialized" << endl;
    cout << "b address:" << "\t" << &b << " value is " << b << endl;
}

int main( void )
{
    int n1 = 1;
    int n2 = 2;
    
    func( n1, n2 );
    
    return 0;
}

Результат работы программы:
size of int:     4
size of char:  1
p1 address:   0012FE7C value is 1
p2 address:   0012FF54 value is 2
a address:     0012FE6C not initialized
b address:     0012FE60 value is 3
PM   Вверх
Sartorius
Дата 10.5.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 почитай disassembly  и все увидишь...
PM MAIL ICQ   Вверх
Daevaorn
Дата 10.5.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(FiMa1 @  10.5.2007,  17:07 Найти цитируемый пост)
Почему разница между адресами переменных a и b равна 12 ?

А почему бы и нет? Компилятор как хочет, так переменные и располагает.

Добавлено через 7 минут и 49 секунд
А вообще выключи ещё отладочную информациюsmile
PM MAIL WWW   Вверх
FiMa1
Дата 10.5.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата
А почему бы и нет? Компилятор как хочет, так переменные и располагает.

Видимо я неправильно понимаю организацию работы стека... Я предполагал, что объекты ложатся в стек последовательно.
PM   Вверх
Daevaorn
Дата 10.5.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(FiMa1 @  10.5.2007,  17:36 Найти цитируемый пост)
Видимо я неправильно понимаю организацию работы стека... Я предполагал, что объекты ложатся в стек последовательно

то что последовательно это факт. по другому никак. другое дело, что между ними может быть ещё что-то, например выравнивание.
PM MAIL WWW   Вверх
FiMa1
Дата 10.5.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



А можно чуть подробнее про это выравнивание? Первый раз слышу... Что-то связанное с отладочной информацией?
PM   Вверх
Daevaorn
Дата 10.5.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(FiMa1 @  10.5.2007,  18:30 Найти цитируемый пост)
А можно чуть подробнее про это выравнивание? Первый раз слышу... 

http://en.wikipedia.org/wiki/Data_structure_alignment
Цитата(FiMa1 @  10.5.2007,  18:30 Найти цитируемый пост)
 Что-то связанное с отладочной информацией

ну эти вещи не связаны. просто в твоем случае из-за режима отладки такие результаты
PM MAIL WWW   Вверх
FiMa1
Дата 10.5.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Всем спасибо за участие!

Это сообщение отредактировал(а) FiMa1 - 11.5.2007, 17:24
PM   Вверх
FiMa1
Дата 11.5.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Выключил отладочную информацию - выставил Release в VS 2005.
Код
#include <iostream>
using namespace std;

int main(void)
{
    int n1 = 1;
    int n2 = 2;
    
    cout << sizeof(int) << endl;
    cout << &n1 << '-' << &n2 << '=' << &n1 - &n2 << endl;
    
    return 0;
}

Результат работы программы:
4
0012FEE4-0012FEE0=1

Почему 0012FEE4-0012FEE0=1, а не 4. Если все-таки 4, то почему 4 байта, ведь имеем две целых переменных по 4 байта каждая, т.е. 8 байт.
PM   Вверх
nickless
Дата 11.5.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(FiMa1 @  11.5.2007,  16:24 Найти цитируемый пост)
&n1 - &n2

Для типизированных указателей разница (да и всё остальное тоже) вычисляется в размерах типов, т.е. в этом случае в intах.

Цитата(FiMa1 @  11.5.2007,  16:24 Найти цитируемый пост)
Если все-таки 4, то почему 4 байта, ведь имеем две целых переменных по 4 байта каждая, т.е. 8 байт

Если сделать 
Код

reinterpret_cast<char*>(&n1) - reinterpret_cast<char*>(&n2)

то выдаст 4, потому что в указателе адрес _начала_ переменной


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
FiMa1
Дата 14.5.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(nickless @ 11.5.2007,  17:35)
то выдаст 4, потому что в указателе адрес _начала_ переменной

Имеем нижеприведенный код.
Код
#include <iostream>
using namespace std;
void STACK(int p1, int& p2) 
{ 
    cout << "STACK 1::p1 "  << "\t" << &p1  << " value is " << p1 << endl;
    cout << "STACK 1::p2 "  << "\t" << &p2  << " value is " << p2 << endl;

    int i=1, i1=3;
    cout << "STACK 1::i "  << "\t" << &i  << " value is " << i << endl;
    cout << "STACK 1::i1 " << "\t" << &i1 << " value is " << i1 << endl;
    { 
        int i=2, i2=5;
        cout << "STACK 1.1::i "  << "\t" << &i  << " value is " << i << endl;
        cout << "STACK 1.1::i2 " << "\t" << &i2 << " value is " << i2 << endl;
        {
            int i=9, i3=7;
            cout << "STACK 1.1.1::i " << "\t" << &i << " value is " << i << endl;
            cout << "STACK 1.1.1::i3 " << &i3 << " value is " << i3 << endl;
        }
        i = 8;
        cout << "STACK 1.1::i " << "\t" << &i << " value is " << i << endl;
        {
            double d = (double)2 * i;
            cout << "STACK 1.1.1::d " << "\t" << &d << " value is " << d << endl;
        }
        i = i1;
        cout << "STACK 1.1::i " << "\t" << &i << " value is " << i << endl;
    }
    {
        char s[] = "abs";
        cout << "STACK 1.1::s " << "\t" << &s << " value is " << s << endl;
    } 
}

int main(void)
{
    int i1 = 1, i2 = 2;

    cout << &i1 << ' ' << &i2 << endl;

    STACK(i1, i2);

    return 0;
}

Результат работы программы:
0012FEE4 0012FEE0
STACK 1::p1     0012FED4 value is 1
STACK 1::p2     0012FEE0 value is 2
STACK 1::i      0012FEC0 value is 1
STACK 1::i1     0012FEB8 value is 3
STACK 1.1::i    0012FEB4 value is 2
STACK 1.1::i2   0012FEC4  value is 5
STACK 1.1.1::i  0012FEC8 value is 9
STACK 1.1.1::i3 0012FEBC value is 7
STACK 1.1::i    0012FEB4 value is 8
STACK 1.1.1::d  0012FEC8 value is 16
STACK 1.1::i    0012FEB4 value is 3
STACK 1.1::s    0012FEBC value is abs

Почему 0012FEC0 (STACK 1::i) - 0012FEB8 (STACK 1::i1) = 8 (отладочная информация выключена - Release ) ? Да и вообще, по-моему, на моей машине стек должен "расти" вниз...

Это сообщение отредактировал(а) FiMa1 - 14.5.2007, 15:22
PM   Вверх
JackYF
Дата 14.5.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(FiMa1 @  14.5.2007,  14:54 Найти цитируемый пост)
Почему 0012FEC0 (STACK 1::i) - 0012FEB8 (STACK 1::i1) = 8


Скорее всего, имеем, опять-таки, выравнивание.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
FiMa1
Дата 14.5.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(JackYF @ 14.5.2007,  16:13)
Скорее всего, имеем, опять-таки, выравнивание.

От этого можно хоть как-нибудь избавиться? Хочу просмотреть чисто работу стека... IDE VS 2005.
PM   Вверх
Daevaorn
Дата 14.5.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(FiMa1 @  14.5.2007,  17:20 Найти цитируемый пост)
Хочу просмотреть чисто работу стека... IDE VS 2005.

А чем эта не чиста? Теорию можно прочитать в умных книжках, а тут практика - тоже полезно.
PM MAIL WWW   Вверх
FiMa1
Дата 15.5.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(Daevaorn @ 14.5.2007,  16:50)
А чем это не чисто? Теорию можно прочитать в умных книжках, а тут практика - тоже полезно.
  • Насколько я понял, согласно теории, на моей машине стек должен "расти" вниз, мы же имеем, что переменная i в блоке STACK 1 расположилась начиная с адреса 0012FEC0, идущая после нее переменная i1 (все тот же блок STACK 1) располагается, судя по выведенным результатам, по адресу 0012FEB8. Не получаем, ситуации что стек "растет" вниз....
  • Ок, пусть стек растет вверх, а не вниз, но разница между адресами 0012FEC0 - 0012FEB8 составляет 8 байт. между тем мы уже выяснили, что должно "4, потому что в указателе адрес _начала_ переменной" (см. выше)...
  • Если таки стек растет вверх, то почему в блоке STACK 1.1, к примеру, переменная i начинается с 0012FEB4, а i2 - с 0012FEC4. Стек теперь растет вниз?.. Ну а разница 0012FEC4 - 0012FEB4, не поверите, составляет 10...

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.