компилятор зарезервирует память для этого объекта? - PullRequest
0 голосов
/ 19 октября 2010

У меня есть два следующих класса:

template <size_t size>
class Cont{
 public:
 char charArray[size];
};
template <size_t size>
class ArrayToUse{
 public:
 Cont<size> container;
 inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){}
};

У меня есть три следующие строки кода в глобальной области видимости:

const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;

В целом мой код. Единственное использование объекта-контейнера для инициализации объекта класса "ArrayToUse", как упоминалось, и после инициализации ссылки "charArray" на "temp.container.charArray" ссылка в остальной части моего кода, теперь мне интересно, резервирует ли компилятор память для объекта-контейнера, так как он получил временное использование?

Ответы [ 3 ]

2 голосов
/ 19 октября 2010

Любая переменная, определенная в глобальной области видимости, имеет зарезервированную для нее память во время компиляции.Это не означает, что он гарантированно будет правильно инициализирован, но он там все тот же.

Во время компоновки Visual C ++ предлагает возможность удалять неиспользуемые данные и функции с помощью / OPT -смотри здесь.

0 голосов
/ 20 октября 2010

Компилятор должен создать переменную container в скомпилированном объектном файле.Это компоновщик, который может определить, нужен он или нет (для символа export ed или из другого модуля компиляции, если объявлен extern).

Но ...

Тип Cont<x> не имеет отношения к Cont<x+1>.Вы не можете зависеть от памяти переменной-члена, размещаемой в подобных модах.Черт возьми, вы даже не можете знать, выглядит ли он одинаково, поскольку существует такая вещь, как «специализация шаблона»:

// your code
template <size_t size>
class Cont{
 public:
 char charArray[size];
};

// my evil tweak
// I'm the worst compiler ever but I feel that this
// array would better be represented as a map...
template<> class Cont<12> {
   std::map<int,char> charArray;
};

// your screwed up result
Cont<12> c12;
Cont<11>& c11( reinterpret_cast<Cont<11>&>(c12) );
char (&s11)[11] = c11.charArray; // points to the first byte of a list object...

EDIT - комментарий @ UncleBen наводит на мысль, что я переусердствовал здесь.И он прав.

в соответствии с wikipedia ,

  • Указатель на объект POD-структуры, соответствующим образом преобразованный с использованием переинтерпретации приведения, указывает наего начальный член и наоборот, подразумевая, что в начале POD-структуры нет заполнения.

Так что в этом случае

  • где charArray является первым членом Cont<n>, и нет членов, не являющихся POD

  • , нет ни оператора присваивания, ни деструктора

Это безопасно.

0 голосов
/ 19 октября 2010

это полностью зависит от вашего конкретного компилятора, так что я бы сказал, проверить сборку и выяснить! компилятор может оптимизировать контейнер или может игнорировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...