Размер структуры, содержащей 1 указатель

Предположим, у меня есть следующий шаблон класса:

template<typename T>
struct Wrapper {
  T* t_;
  static void check() {
    static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
  }
};

Я просмотрел стандарт C99 и стандарт C++03 и не могу найти гарантии для моего предположения, выраженного в static_assert. Я попробовал его на Visual C++ 2008 и 2010 (32-бит )и gcc на linux (64-бит ), используя несколько параметров компилятора, и мое предположение подтвердилось.

Мой вопрос::

  • Разумно ли мое предположение для Visual C++ 2008/2010/11 (windows )?
  • Для gcc 4.*(Linux )?
  • Для любой комбинации флагов компилятора?
  • Известны ли вам какие-либо компиляторы/платформы, в которых это предположение не выполняется?

Я предполагаю, что компилятор мог бы добавить некоторые дополнения к структуре, например. в целях отладки. Но есть ли компилятор, который действительно это делает?

Изменить:Итак, как вы спросили, вот чего я хочу достичь:
У меня есть функция-член со следующей сигнатурой:

Someclass* OtherClass::fn();

Я хочу изменить сигнатуру вот так:

Wrapper<Someclass> OtherClass::fn();

Эта оболочка действует как какая-то умная -указатель, т.е. он заботится о времени жизни указателя, поэтому он освобождает его, когда он выходит за пределы области видимости. Поскольку функция вызывается через границу dll, я хочу убедиться, что возвращаемое значение (, которое теперь является конкретным типом, а не просто тупым указателем ), при любых обстоятельствах (, т.е. настройки компилятора и т. д. )того же размера, что и указатель. План/надежда состоит в том, чтобы поддерживать все комбинации отладки/выпуска приложений/сборок dll.
Как вы можете спросить :нет, я не могу использовать boost ::shared _ptr<>, std ::shared _ptr<>, std ::unique _ptr<> и например, поскольку мы не хотим предоставлять boost пользователю dll, и мы еще не поддерживаем C++11.

5
задан nriedlin 4 May 2012 в 14:50
поделиться