LINUX.ORG.RU

История изменений

Исправление dissident, (текущая версия) :

Из того же Саттера:

Alignment. Any memory that's allocated dynamically via new or malloc is guaranteed to be properly aligned for objects of any type, but buffers that are not allocated dynamically have no such guarantee:

char* buf1 = (char*)malloc( sizeof(Y) ); 
char* buf2 = new char[ sizeof(Y) ];
char  buf3[ sizeof(Y) ];
new (buf1) Y;     // OK, buf1 allocated dynamically (A)
new (buf2) Y;     // OK, buf2 allocated dynamically (B)
new (&buf3[0]) Y; // error, buf3 may not be suitably aligned
(reinterpret_cast<Y*>(buf1))->~Y(); // OK
(reinterpret_cast<Y*>(buf2))->~Y(); // OK
(reinterpret_cast<Y*>(&buf3[0]))->~Y(); // error

(c) тот же Herb Sutter «Exceptional C++» Item 30 solution.

Placement new есть в C++98. alignof нету. Значит есть способ, заставить его работать без undefined behavior.

Я исхожу из того, что разница между тем что возвращает

new int[N]

и

static_cast<int*>(operator new(sizeof(int)*N))

не должна отличаться ничем, кроме как тем, что там в находится сразу после создания: мусор или нули или DEADBEAF или какое-то иное значение по умолчанию или unspecified whatever.

sizeof(int)
уже должен учитывать alignment, поэтому размер обоих массивов должен быть такой же. Разве что в массиве между элементами есть «дырки» из-за того же alignment, но насколько я понимаю это не так? Если же это именно так, то почему он об этом вовсе не вспомнил в предыдущем примере со StackImpl?

Выше Саттер жалуется что для буферов на stack'e это не работает, а на heap'e работает, я не знаю еще почему, ты знаешь? Линки про «объекты» из стандарта, возможно и исчерпывающе отвечают на вопрос, но не мне (необучаем же). Кроме того еще и водку пью. Но это кого-то е...т, а?

Какова информационная ценность обсуждения моих недостатков? Лучше бы не поленился, а объяснил для дебилов вроде меня доступнее. Может еще кому-то пригодится.

Исправление dissident, :

Из того же Саттера:

Alignment. Any memory that's allocated dynamically via new or malloc is guaranteed to be properly aligned for objects of any type, but buffers that are not allocated dynamically have no such guarantee:

char* buf1 = (char*)malloc( sizeof(Y) ); 
char* buf2 = new char[ sizeof(Y) ];
char  buf3[ sizeof(Y) ];
new (buf1) Y;     // OK, buf1 allocated dynamically (A)
new (buf2) Y;     // OK, buf2 allocated dynamically (B)
new (&buf3[0]) Y; // error, buf3 may not be suitably aligned
(reinterpret_cast<Y*>(buf1))->~Y(); // OK
(reinterpret_cast<Y*>(buf2))->~Y(); // OK
(reinterpret_cast<Y*>(&buf3[0]))->~Y(); // error

(c) тот же Herb Sutter «Exceptional C++» Item 30 solution.

Placement new есть в C++98. alignof нету. Значит есть способ, заставить его работать без undefined behavior.

Я исхожу из того, что разница между тем что возвращает

new int[N]

и

static_cast<int*>(operator new(sizeof(int)*N))

не должна отличаться ничем, кроме как тем, что там в находится сразу после создания: мусор или нули или DEADBEAF или какое-то иное значение по умолчанию или unspecified whatever.

sizeof(int)
уже должен учитывать alignment, поэтому размер обоих массивов должен быть такой же. Разве что в массиве между элементами есть «дырки» из-за того же alignment, но насколько я понимаю это не так? Если же это именно так, то почему он об этом вовсе не вспомнил в предыдущем примере со StackImpl?

Выше Саттер жалуется что для буферов на stack'e это не работает, а на heap'e работает, я не знаю еще почему, ты знаешь? Линки про «объекты» из стандарта, возможно и исчерпывающе отвечают на вопрос, но не мне (необучаем же). Кроме того еще и водку пью.

Но это кого-то е...т, а?

Какова информационная ценность обсуждения моих недостатков? Лучше бы не поленился, а объяснил для дебилов вроде меня доступнее. Может еще кому-то пригодится.

Исходная версия dissident, :

Из того же Саттера:

Alignment. Any memory that's allocated dynamically via new or malloc is guaranteed to be properly aligned for objects of any type, but buffers that are not allocated dynamically have no such guarantee:

char* buf1 = (char*)malloc( sizeof(Y) ); 
char* buf2 = new char[ sizeof(Y) ];
char  buf3[ sizeof(Y) ];
new (buf1) Y;     // OK, buf1 allocated dynamically (A)
new (buf2) Y;     // OK, buf2 allocated dynamically (B)
new (&buf3[0]) Y; // error, buf3 may not be suitably aligned
(reinterpret_cast<Y*>(buf1))->~Y(); // OK
(reinterpret_cast<Y*>(buf2))->~Y(); // OK
(reinterpret_cast<Y*>(&buf3[0]))->~Y(); // error

(c) тот же Herb Sutter «Exceptional C++» Item 30 solution.

Placement new есть в C++98. alignof нету. Значит есть способ, заставить его работать без undefined после создания: мусор или нули или DEADBEAF или какое-то иное значение по умолчанию или unspecified whatever.

Я исхожу из того, что разница между тем что возвращает

new int[N]

и

static_cast<int*>(operator new(sizeof(int)*N))

не должна отличаться ничем, кроме как тем, что там в находится сразу после создания: мусор или нули или DEADBEAF или какое-то иное значение по умолчанию или unspecified whatever.

sizeof(int)
уже должен учитывать alignment, поэтому размер обоих массивов должен быть такой же. Разве что в массиве между элементами есть «дырки» из-за того же alignment, но насколько я понимаю это не так? Если же это именно так, то почему он об этом вовсе не вспомнил в предыдущем примере со StackImpl?

Выше Саттер жалуется что для буферов на stack'e это не работает, а на heap'e работает, я не знаю еще почему, ты знаешь? Линки про «объекты» из стандарта, возможно и исчерпывающе отвечают на вопрос, но не мне (необучаем же). Кроме того еще и водку пью.

Но это кого-то е...т, а?

Какова информационная ценность обсуждения моих недостатков? Лучше бы не поленился, а объяснил для дебилов вроде меня доступнее. Может еще кому-то пригодится.