Есть ли способ (признак или так) обнаружить, если у структуры/класса есть отступы?Обнаружить, если у структуры есть отступы
Мне не нужны кросс-платформенные или стандартизованные решения, мне это нужно для MSVC2013.
я могу проверить это, как
namespace A
{
struct Foo
{
int a;
bool b;
};
}
#pragma pack(push, 1)
namespace B
{
struct Foo
{
int a;
bool b;
};
}
#pragma pack(pop)
static const bool has_padding = sizeof(A::Foo) != sizeof(B::Foo);
Но C++ не позволяет (насколько я знаю) порождают это неинвазивный (не касаясь существующих структур)
В идеале я хотел бы получить работает что-то вроде этого
template <typename T>
struct has_padding_impl
{
typedef __declspec(align(1)) struct T AllignedT;
};
template <typename T>
struct has_padding : typename std::conditional<sizeof(typename has_padding_impl<T>::AllignedT) == sizeof(T),
std::false_type,
std::true_type>::type{};
EDIT - Зачем мне это нужно?
I'am работает с существующей системой сериализации, хранящей некоторой просто-структуру, принимая void*
к ним (внутри родовой функции) и хранить sizeof(T)
числом байт, ... Такой бинарный файл не является переносимым на платформах мы ориентируемся, так как используются разные компиляторы, поэтому нет никакой гарантии, как добавляется прокладка. Если бы я мог статически обнаруживать все T
, которые являются структурами с заполнением, я могу заставить пользователя вручную вставлять дополнения (некоторые элементы управления, например, не просто случайный мусор), поэтому нет «случайного» заполнения. Другое приключение - когда я разберу два файла с сохранением одного и того же scenerio, они будут выглядеть одинаково.
Редактировать 2 Чем больше я думаю об этом, тем больше я понимаю, что мне нужно кросс-платформенное решение. В основном мы разрабатываем на msvc2013, но наше приложение находится в окончательной версии в msvc2012 и clang. Но если я обнаружил и избавился от всех дополнений, созданных с помощью компилятора, в msvc2013, нет гарантии, что другой компилятор не вставляет прокладку ... (поэтому обнаружение msvc2013 недостаточно)
Почему, по-вашему, вам это нужно? –
Padding ведет себя как неназванный участник. Поскольку вы не можете перечислять членов, невозможно отличить нормальных членов и тех «неназванных членов», которые выступают в качестве дополнения. – MSalters
Вы знаете, что вы можете указать поведение дополнений MSVC, используя параметр «Выравнивание элементов Struct» на странице конфигурации Code Generation, верно? –