Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
#1

Шаблоны, наследование и размер типа - C++

22.11.2012, 09:11. Просмотров 670. Ответов 10
Метки нет (Все метки)

Суть вопроса в том, что имея два шаблона класса, унаследованных от общего предка, и инстанциируя "один другим"
имеем + n байт к размеру типа (по крайней мере на gcc). Надеюсь я понятно выразился) Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
 
struct base {};
 
template<typename Type>
struct left : base {
 
   Type value;
};
 
template<typename Type>
struct right : base {
 
   Type value;
};
 
 
struct padding {
   char _padding_[32];
};
 
 
int main() {
   std::cout << "sizeof padding              = " << sizeof (padding)              << std::endl;
   std::cout << "sizeof left<padding>        = " << sizeof (left<padding>)        << std::endl;
   std::cout << "sizeof right<padding>       = " << sizeof (right<padding>)       << std::endl;
   std::cout << "sizeof left<right<padding>> = " << sizeof (left<right<padding>>) << std::endl;
   std::cout << "sizeof right<left<padding>> = " << sizeof (right<left<padding>>) << std::endl;
}
вывод
Код
sizeof padding              = 32
sizeof left<padding>        = 32
sizeof right<padding>       = 32
sizeof left<right<padding>> = 33
sizeof right<left<padding>> = 33

http://ideone.com/0VnYCB
Если не наследовать оба сразу, то эффект исчезает. Никак не соображу, в связи с чем это происходит.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 09:22     Шаблоны, наследование и размер типа #2
На студии 2012:
Название: Безымянный.jpg
Просмотров: 87

Размер: 13.2 Кб
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.11.2012, 09:35     Шаблоны, наследование и размер типа #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
 
struct base {};
 
template<typename Type>
struct left : base {
 
   Type value;
};
 
template<typename Type>
struct right : base {
 
   Type value;
}; 
 
struct padding {
   char _padding_[32];
}; 
 
int main() {
   std::cout << "sizeof left<base> = " << sizeof(left<base>) << std::endl;
   std::cout << "sizeof left<right<base>>    = " << sizeof(left<right<base>>) << std::endl;
   std::cout << "sizeof left<right<left<right<left<base>>>>> = " << sizeof(left<right<left<right<left<base>>>>>) << std::endl;
}
Bash
1
2
3
4
5
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x 
forever@pterois:~/My_pro1/cpp_pro$ ./new 
sizeof left<base> = 2
sizeof left<right<base>>    = 3
sizeof left<right<left<right<left<base>>>>> = 6
Bash
1
2
3
4
5
forever@pterois:~/My_pro1/cpp_pro$ clang++ -o new new.cpp -std=c++0x 
forever@pterois:~/My_pro1/cpp_pro$ ./new 
sizeof left<base> = 2
sizeof left<right<base>>    = 3
sizeof left<right<left<right<left<base>>>>> = 6
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 09:37     Шаблоны, наследование и размер типа #4
Добавил в класс base поле int, получилось 40 байт. Собственно 32+4+4 (GCC)
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
22.11.2012, 09:44  [ТС]     Шаблоны, наследование и размер типа #5
Croessmah, здесь вроде понятно, мне интересен случай именно с пустым базовым классом. Видимо, он для каждого "лишнего" базового класса добавляет по размеру выравнивания, и мне не понятно, зачем он это делает.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.11.2012, 10:02     Шаблоны, наследование и размер типа #6
Croessmah, Можешь на MSVC проверить мой код и выложить результаты?
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 10:05     Шаблоны, наследование и размер типа #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Можешь на MSVC проверить мой код и выложить результаты?
Шаблоны, наследование и размер типа
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
22.11.2012, 10:10  [ТС]     Шаблоны, наследование и размер типа #8
Хм, с MSVС я бы и не наткнулся на это)
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.11.2012, 10:50     Шаблоны, наследование и размер типа #9
Видимо impl defined... Ибо нормальных ответов я не вижу даже на стеке, собственно нужно смотреть в реализацию и пытаться найти что делается для того, чтобы посчитать sizeof.

http://stackoverflow.com/questions/1...-from-one-base

#pragma pack(1) предсказуемо выдает результат как в VS

Ответ второго товарища логичен и вполне может оказаться верным.
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 10:56     Шаблоны, наследование и размер типа #10
Цитата Сообщение от ForEveR Посмотреть сообщение
чтобы посчитать sizeof.
либо как происходит "создание" класса, ведь это только если класс пустой проявляется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 11:39     Шаблоны, наследование и размер типа
Еще ссылки по теме:

Наследование и шаблоны C++
C++ [Классы, Наследование, Шаблоны] Добавление записи в список
C++ Шаблоны, макросы, размер массива
Подстановка типа\шаблоны с++ C++
C++ Наследование и шаблоны

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
22.11.2012, 11:39  [ТС]     Шаблоны, наследование и размер типа #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Видимо impl defined...
Да, похоже на то. Свою связанную с этим проблему (вроде бы) решил с помощью CRTP.

Добавлено через 41 минуту
Думаю, товарищ со stackoverflow прав. При невиртуальном наследовании мы должны иметь доступ ко всем экземлярам базового класса, и у каждого должен быть свой адрес. Адрес первого совпадает с наследуемым, для остальных выделяется по sizeof allignment. Comeau online поступает так же, как gcc и clang, так что MSVC++ - ну как всегда...)
Yandex
Объявления
22.11.2012, 11:39     Шаблоны, наследование и размер типа
Ответ Создать тему
Опции темы

Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru