Здравствуйте, GhostCoders, Вы писали:
GC>Есть небор типов (различных структур С++), необходимо найти размер максимальной структуры: GC>Или что попроще придумать?
GC>Есть небор типов (различных структур С++), необходимо найти размер максимальной структуры: GC>В этом примере максимальный размер структуры — 400 байт (структура D). GC>union не помогает, так как в каждой структуре есть свой конструктор.
Максимальный размер ты нашел.
Причем здесь union?
Тебе не размер нужен, а что?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Максимальный размер типа во время компиляции
GC>struct A
GC>{
GC> char field_a;
GC> A(): field_a('a') {}
GC>};
GC>struct B
GC>{
GC> double c;
GC> B() : c(10.0) {}
GC>};
GC>struct D
GC>{
GC> int buffer[100];
GC> D()
GC> {
GC> //... some code...
GC> }
GC>};
GC>
GC>В этом примере максимальный развер структуры — 400 байт (структура D).
GC>union не помогает, так как в каждой структуре есть свой конструктор.
Просто вы не умеете его готовить.
union E { char a[sizeof(A)], b[sizeof(B)], d[sizeof(D)]; };
...
char buf[sizeof(E)];
Re[2]: Максимальный размер типа во время компиляции
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, GhostCoders, Вы писали:
TB>Я чёто туплю и не вижу подвоха наверное, почему нельзя тупо просто в лоб? TB>
TB>#define max(a,b) ((a)>(b)?(a):(b))
TB>const int ms = max(max(sizeof(A), sizeof(B)), sizeof(C));
TB>
В принципе я так и делал, только через boost.
Вообщем, всем спасибо за помощь, я лаже не ожидал, что будет столько толковых ответов!
но... вообщем, исходная задача изменилась (вернее подход к ее решению) и теперь мне вообще это не требуется (т.е. максимальный размер типа).
Третий Рим должен пасть!
Re[3]: Максимальный размер типа во время компиляции
Здравствуйте, uzhas, Вы писали:
U>уточните где вы увидели проблемы с выравниванием?
Юнион вообще не выравнивается, тогда как содержащиеся типы могут требовать выравнивание.
Для гарантированного воспроизведения проблемы сделать, чтобы наибольший тип имел нечётный размер, и разместить два таких юниона подряд в структуре или массиве:
#include <stdio.h>
using namespace std;
struct A
{
int a;
};
struct B
{
char b[9];
};
union U
{
char a[sizeof(A)];
char b[sizeof(B)];
};
int main() {
U u[2];
printf("%p, %p", &(((A*)(&u[0].a))->a), &(((A*)(&u[1].a))->a) );
return 0;
}
Русский военный корабль идёт ко дну!
Re[5]: Максимальный размер типа во время компиляции
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, uzhas, Вы писали:
U>>уточните где вы увидели проблемы с выравниванием?
AG>Юнион вообще не выравнивается,
возможно, я не понял эту фразу, но union выравнивается под наибольший мембер, то бишь он правильно выравнен для доступа к любому полю
можно почитать в гугле: http://stackoverflow.com/questions/8625368/alignment-of-variable-in-union
AG> тогда как содержащиеся типы могут требовать выравнивание.
в наших примерах в union содержатся только массивы char, для которых требование к выравниванию равно 1
AG>Для гарантированного воспроизведения проблемы сделать, чтобы наибольший тип имел нечётный размер, и разместить два таких юниона подряд в структуре или массиве:
"нечетный размер" — это уже говорит о непонимании выравнивания. размер и требования на выравнивание — разные вещи. для char[N] требование на выравнивание равно 1
Здравствуйте, uzhas, Вы писали:
AG>>Юнион вообще не выравнивается, U>возможно, я не понял эту фразу, но union выравнивается под наибольший мембер, то бишь он правильно выравнен для доступа к любому полю
Я про состоящий из char.
AG>> тогда как содержащиеся типы могут требовать выравнивание. U>в наших примерах в union содержатся только массивы char, для которых требование к выравниванию равно 1
Вот именно. Но мы то собираемся помещать и доставать типы, sizeof для которых взяли.
Разумеется, можно не конструировать через placement new, и не доставать кастом, а всегда использовать memcpy, но это уже противоречит цели union.
Русский военный корабль идёт ко дну!
Re[7]: Максимальный размер типа во время компиляции