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

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

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

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

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

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

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

Шаблоны и наследование - 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++
Здравствуйте. У меня возникла проблема. Есть 4 класса: Father - абстрактный шаблонный класс (типа интерфейс) Son - его потомок с...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:22     Шаблоны, наследование и размер типа #2
На студии 2012:
Название: Безымянный.jpg
Просмотров: 87

Размер: 13.2 Кб
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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Эксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:37     Шаблоны, наследование и размер типа #4
Добавил в класс base поле int, получилось 40 байт. Собственно 32+4+4 (GCC)
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
22.11.2012, 09:44  [ТС]     Шаблоны, наследование и размер типа #5
Croessmah, здесь вроде понятно, мне интересен случай именно с пустым базовым классом. Видимо, он для каждого "лишнего" базового класса добавляет по размеру выравнивания, и мне не понятно, зачем он это делает.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.11.2012, 10:02     Шаблоны, наследование и размер типа #6
Croessmah, Можешь на MSVC проверить мой код и выложить результаты?
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 10:05     Шаблоны, наследование и размер типа #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Можешь на MSVC проверить мой код и выложить результаты?
Шаблоны, наследование и размер типа
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
22.11.2012, 10:10  [ТС]     Шаблоны, наследование и размер типа #8
Хм, с MSVС я бы и не наткнулся на это)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
22.11.2012, 10:50     Шаблоны, наследование и размер типа #9
Видимо impl defined... Ибо нормальных ответов я не вижу даже на стеке, собственно нужно смотреть в реализацию и пытаться найти что делается для того, чтобы посчитать sizeof.

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

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

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

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

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

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

Подстановка типа\шаблоны с++ - C++
Добрый день, не могу разобраться представим есть классец находится в .h enum MyEnum { enum1 = 0, enum2 = 1 } ...

Шаблоны изменение типа - C++
Передо мной стоит такая задача: class par1; class par2; class par3; class MyClass //Основной класс {


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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     Шаблоны, наследование и размер типа
Ответ Создать тему
Опции темы

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