Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

22.11.2012, 09:11. Просмотров 721. Ответов 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
Если не наследовать оба сразу, то эффект исчезает. Никак не соображу, в связи с чем это происходит.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2012, 09:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шаблоны, наследование и размер типа (C++):

Наследование и шаблоны - C++
Доброе время суток. Есть три класс: interface.h template &lt;class T&gt; class interface { public: ...

Наследование и шаблоны - C++
Здравствуйте. У меня возникла проблема. Есть 4 класса: Father - абстрактный шаблонный класс (типа интерфейс) Son - его потомок с...

Шаблоны и наследование - C++
Есть код с учебника: #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; template &lt;class T&gt; class...

Наследование и шаблоны - C++
Доброго времени суток всем! Требуется внести ясность в следующую задачу. Существует абстрактный класс AbstractGenerator&lt;имя типа&gt; (не...

Наследование и шаблоны - C++
Не понимаю почему выдается ошибки, переменные а, b не объявлены в данном контексте (внутри функции f) Сейчас почитал прату, и...

Наследование и шаблоны - C++
Почему при использовании шаблонов при обращении к элементам класса нужно явно указывать потомка или this? Ведь при наследовании без...

10
Croessmah
Ушел
13783 / 8033 / 928
Регистрация: 27.09.2012
Сообщений: 19,802
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:22 #2
На студии 2012:
Название: Безымянный.jpg
Просмотров: 92

Размер: 13.2 Кб
2
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
1
Croessmah
Ушел
13783 / 8033 / 928
Регистрация: 27.09.2012
Сообщений: 19,802
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:37 #4
Добавил в класс base поле int, получилось 40 байт. Собственно 32+4+4 (GCC)
1
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
22.11.2012, 09:44  [ТС] #5
Croessmah, здесь вроде понятно, мне интересен случай именно с пустым базовым классом. Видимо, он для каждого "лишнего" базового класса добавляет по размеру выравнивания, и мне не понятно, зачем он это делает.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.11.2012, 10:02 #6
Croessmah, Можешь на MSVC проверить мой код и выложить результаты?
0
Croessmah
Ушел
13783 / 8033 / 928
Регистрация: 27.09.2012
Сообщений: 19,802
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 10:05 #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Можешь на MSVC проверить мой код и выложить результаты?
Шаблоны, наследование и размер типа
1
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
22.11.2012, 10:10  [ТС] #8
Хм, с MSVС я бы и не наткнулся на это)
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.11.2012, 10:50 #9
Видимо impl defined... Ибо нормальных ответов я не вижу даже на стеке, собственно нужно смотреть в реализацию и пытаться найти что делается для того, чтобы посчитать sizeof.

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

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

Ответ второго товарища логичен и вполне может оказаться верным.
1
Croessmah
Ушел
13783 / 8033 / 928
Регистрация: 27.09.2012
Сообщений: 19,802
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 10:56 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
чтобы посчитать sizeof.
либо как происходит "создание" класса, ведь это только если класс пустой проявляется.
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
22.11.2012, 11:39  [ТС] #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Видимо impl defined...
Да, похоже на то. Свою связанную с этим проблему (вроде бы) решил с помощью CRTP.

Добавлено через 41 минуту
Думаю, товарищ со stackoverflow прав. При невиртуальном наследовании мы должны иметь доступ ко всем экземлярам базового класса, и у каждого должен быть свой адрес. Адрес первого совпадает с наследуемым, для остальных выделяется по sizeof allignment. Comeau online поступает так же, как gcc и clang, так что MSVC++ - ну как всегда...)
1
22.11.2012, 11:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 11:39
Привет! Вот еще темы с ответами:

Функциональные шаблоны и наследование - C++
#include &lt;list&gt; using namespace std; class A { public: virtual void doit() =0; };

Не могу разобраться с ошибками, наследование и шаблоны - C++
Задание: Смоделировать стек на базе статического массива по заданию. Написать основные операции для работы со стеком (push, pop, top,...

[Классы, Наследование, Шаблоны] Добавление записи в список - C++
В данной программе используется наследование с применением шаблонов класса. В другой похожей программе не используя наследования программа...

Шаблоны, макросы, размер массива - C++
Статья http://habrahabr.ru/company/pvs-studio/blog/119815/ Там есть такой код template &lt;typename T, size_t N&gt; char...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru