crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> struct, и ее адрес.
Гость_TheGuest_*
сообщение 9.7.2015, 21:49
Сообщение #1





Гости








    


Доброго времени суток. У меня вопрос.
К примеру есть структура.

struct f
{
    int x;
    int y;    
};

int main ()
{
    f a;
    f b;
    
    cout<<&a<<endl<<&b<<endl;

    cout<<&a.x<<endl<<&a.y<<endl<<endl<<endl<<&b.x<<endl<<&b.y<<endl;

    system("pause");
    return 0;
}


А теперь вопрос. Почему у структуры a и у a.x один и тот же адрес??? Ситуация с b и b.x такая же, почему так ?? Это как в одномерных массивах получается ?
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 9.7.2015, 22:15
Сообщение #2





Гости








    


Цитата(Гость_TheGuest_* @ 9.7.2015, 21:49) *
Почему у структуры a и у a.x один и тот же адрес?

А почему нет? Что такое структура? Набор нескольких переменных в одном блоке. Переменные размещаются в порядке объявления. Естественно, что адрес структуры совпадёт с адресом её первого элемента.

А теперь добавьте к структуре конструктор, деструктор и какой-либо метод. Получим класс (struct в C++ - класс, где всё по умолчанию public). Для него &a и &a.x уже будут разными. (Или не будут - как компилятор разместит...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheGuest_*
сообщение 9.7.2015, 22:28
Сообщение #3





Гости








    


Цитата(Гость @ 9.7.2015, 22:15) *
Цитата(Гость_TheGuest_* @ 9.7.2015, 21:49) *
Почему у структуры a и у a.x один и тот же адрес?

А почему нет? Что такое структура? Набор нескольких переменных в одном блоке. Переменные размещаются в порядке объявления. Естественно, что адрес структуры совпадёт с адресом её первого элемента.

А теперь добавьте к структуре конструктор, деструктор и какой-либо метод. Получим класс (struct в C++ - класс, где всё по умолчанию public). Для него &a и &a.x уже будут разными. (Или не будут - как компилятор разместит...)



Попробовал. Добавил функцию.
struct f
{
    int sum()
    {
    return 1+1;
    }
    int x;
    int y;
    
};


Но адреса остались прежними. Но все равно, спасибо Вам за разъяснения!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ahalaj
  опции профиля:
сообщение 10.7.2015, 0:39
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 14.6.2014
Пользователь №: 4166

Спасибо сказали: 13 раз(а)




Репутация:   1  


Цитата(TheGuest @ 9.7.2015, 22:28) *
Но адреса остались прежними. Но все равно, спасибо Вам за разъяснения!

Чтобы адреса были разные функция должна быть виртуальная.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheGuest_*
сообщение 10.7.2015, 1:07
Сообщение #5





Гости








    


Цитата(ahalaj @ 10.7.2015, 0:39) *
Цитата(TheGuest @ 9.7.2015, 22:28) *
Но адреса остались прежними. Но все равно, спасибо Вам за разъяснения!

Чтобы адреса были разные функция должна быть виртуальная.



Правда, как дописал virtual, адреса поменялись, а почему так происходит??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.7.2015, 9:21
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1555
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 211 раз(а)




Репутация:   12  


Цитата(TheGuest @ 10.7.2015, 3:07) *
Правда, как дописал virtual, адреса поменялись, а почему так происходит??

потому что создаётся таблица виртуальных методов и компилятор помещает её в начале области памяти структуры (или класса).
почитай про таблицу виртуальных методов, например, здесь.
там очень упрощённо, на примере GCC, описана схема распределения памяти для указателей на виртуальные таблицы. компиляторы делают это немного по-разному, но таблица виртуальных методов всегда в начале блока.

P.S. это хорошо, что ты интересуешься тем, как всё устроено внутри. хорошее понимание того, как работает компилятор, никогда не помешает. а сейчас это редко встречается. обычно новички задают вопросы, как покрасить кнопочку в зелёный цвет или около того :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 10.7.2015, 11:08
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Цитата(Iron Bug @ 10.7.2015, 9:21) *
потому что создаётся таблица виртуальных методов и компилятор помещает её в начале области памяти структуры (или класса). [......] компиляторы делают это немного по-разному, но таблица виртуальных методов всегда в начале блока.

Более точно будет сказать, что компилятор может разместить ТВМ в начале блока. А может - разместить где-то еще, т.к. Стандартом этот layout не специфицирован.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.7.2015, 12:30
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1555
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 211 раз(а)




Репутация:   12  


Цитата(Влад @ 10.7.2015, 13:08) *
Более точно будет сказать, что компилятор может разместить ТВМ в начале блока. А может - разместить где-то еще, т.к. Стандартом этот layout не специфицирован.

именно это я и имела в виду. но по факту все известные мне С++ компиляторы размещают таблицу в начале блока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 10.7.2015, 13:24
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Хмм. Имей в виду, что это поведение некоторых конкретных компиляторов, и полагаться, что так оно будет "всегда и везде" - крайне опасно.

Приведу пример из собственного опыта:
"Считается", что физическое представление NULL-указателя - это 0x00000000. И все известные мне компиляторы для x86 так и поступают. Даже в хидерах оно прописано.
Но вот энное время назад мне довелось поработать с архитектурой (Гарвард, ага), в которой адрес 0x00000000 был вполне себе валидным, и по этому адресу могли располагаться реальные объекты. Ага, а NULL-указатель в оной архитектуре имел физическое значение 0xFFFFFFFF...... (Си-компилер автомагически :) преобразовывал литеральный ноль в это самое значение. Что полностью соответствует требованию Библии.)
Так что, вишь как, могут быть варианты.......
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_TheGuest_*
сообщение 10.7.2015, 13:48
Сообщение #10





Гости








    


Теперь понятно все, спасибо вам всем за разъяснения!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.1.2018, 16:55