struct A
{
int i;
};
struct B
{
B(){}
int i;
}
Всем привет
Я знаю, что «POD означает простой старый тип данных, который по определению не может иметь определяемый пользователем конструктор».
Но я не могу понять, почему это правило эффективно, когда «определение имеет пользовательский default-con».
Нет разницы в их расположении памяти. Почему тип A — это POD, а не B?
Причина проста. Как только вы определите конструктор (любой
конструктор), язык предполагает, что класс нуждается в некотором
вид инициализации; что просто копировать биты в своем изображении
не будет достаточно, чтобы создать новый экземпляр. И один из
Важной характеристикой POD является то, что они могут быть memcpy’ed.
В итоге, компилятор делает не посмотрите на содержание класса
определить, является ли это POD или нет (за исключением того, чтобы увидеть, если какой-либо из
Члены являются стручками). Смотрит ли ты что-то определил
специальные, которые могут повлиять на инициализацию, назначение или
уничтожение этих членов.
Концепция чего-либо POD был разбит на тривиальные и стандартные макеты концепции. Вы можете запросить эти свойства через стандартные черты типа.
Учебный класс B
не POD, потому что это не тривиально. Это не тривиально, потому что он имеет предоставленный пользователем конструктор по умолчанию. Или пропустите это или используйте новый C ++ 11 =default
синтаксис.
#include <type_traits>
#include <iostream>
#include <ios>
struct A
{
int i;
};
struct B
{
B(){}
int i;
};
struct C
{
C() = default;
int i;
};
int main()
{
std::cout << std::boolalpha << std::is_pod<A>::value << " ";
std::cout << std::boolalpha << std::is_trivial<A>::value << " ";
std::cout << std::boolalpha << std::is_standard_layout<A>::value << "\n";
std::cout << std::boolalpha << std::is_pod<B>::value << " ";
std::cout << std::boolalpha << std::is_trivial<B>::value << " ";
std::cout << std::boolalpha << std::is_standard_layout<B>::value << "\n";
std::cout << std::boolalpha << std::is_pod<C>::value << " ";
std::cout << std::boolalpha << std::is_trivial<C>::value << " ";
std::cout << std::boolalpha << std::is_standard_layout<C>::value << "\n";
}
true true true
false false true
true true true
POD позволяют компилятору выполнять определенные оптимизации. Как правило, типом является POD, если компилятору разрешено обрабатывать struct
так же, как C-компилятор.
В частности, при инициализации структуры POD компилятору просто необходимо зарезервировать память соответствующего размер, это не нужно беспокоиться о инициализация. Инициализация может быть запрошена явно программистом, но она никогда не происходит неявно, как это может быть в случае с определяемым пользователем конструктором.
Например, определенный пользователем конструктор по умолчанию может потребовать инициализации данных до 0. В общем случае конструктор по умолчанию может даже иметь произвольные побочные эффекты что компилятор должен учитывать.