Більшість компіляторів C ++ вирішили викликати помилку компіляції при спробі отримати sizeof(void)
.
Під час компіляції C gcc не відповідає нормам і вирішив визначити sizeof(void)
як 1. Це може виглядати дивно, але має обґрунтування. Коли ви робите арифметичне вказівника, додавання або видалення однієї одиниці означає додавання або видалення об'єкта, вказаного на розмір. Таким чином, визначення sizeof(void)
як 1 допомагає визначити void*
як вказівник на байт (нетипізована адреса пам'яті). В іншому випадку у вас буде дивовижна поведінка з використанням арифметики вказівникаp+1 == p when
p isvoid*
. Така арифметика покажчиків на порожніх вказівниках не допускається в C ++, але чудово працює із компіляцією C з gcc.
Стандартним рекомендованим способом буде використання char*
для такої мети (вказівник на байт).
Ще одна подібна різниця між C та C ++ при використанні sizeof виникає, коли ви визначили порожню структуру, наприклад:
struct Empty {
} empty;
Використання gcc як мого компілятора C. sizeof(empty)
повертає 0. За допомогою g ++ той самий код поверне 1.
Я не впевнений, що зазначає стандарти C і C ++ щодо цього питання, але я вважаю, що визначення розміру деяких порожніх структур / об'єктів допомагає в управлінні посиланнями, щоб уникнути того, що два посилання на різні послідовні об'єкти, перше порожнє, отримують та ж адреса. Якщо посилання реалізуються з використанням прихованих покажчиків, як це часто роблять, переконавшись, що інша адреса допоможе їх порівняти.
Але це лише уникнення дивовижної поведінки (порівняння посилань у кутових випадках) шляхом введення іншого (порожні об'єкти, навіть POD споживають принаймні 1 байт пам'яті).