У деяких випадках, наприклад описаний, стандарт C ++ дозволяє компіляторам обробляти конструкції будь-яким способом, яким їхні клієнти вважатимуть найбільш корисними, не вимагаючи, щоб така поведінка була передбачуваною. Іншими словами, такі конструкції викликають "Невизначене поведінку". Однак це не означає, що такі конструкції мають бути «забороненими», оскільки стандарт C ++ явно відмовляється від юрисдикції щодо того, які добре сформовані програми можуть «робити». Хоча я не знаю жодного опублікованого документа з обґрунтуванням стандарту C ++, той факт, що він описує не визначене поведінку, як це робиться у C89, напрошував би передбачуваний сенс подібний: "Невизначена поведінка дає ліцензію виконавця не вловлювати певні програмні помилки, які є складними. поставити діагноз.
Існує багато ситуацій, коли найефективніший спосіб обробити щось, включаючи написання частин структури, про яку піклується код за потоком, опускаючи ті, про які не йдеться про код нижче. Вимагання того, щоб програми ініціалізували всіх членів структури, в тому числі тих, про які ніколи не буде байдуже, само собою не буде перешкоджати ефективності.
Крім того, є деякі ситуації, коли може бути найбільш ефективним, щоб неініціалізовані дані поводилися недетерміновано. Наприклад, наведено:
struct q { unsigned char dat[256]; } x,y;
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
temp.dat[arr[i]] = i;
x=temp;
y=temp;
}
якщо код за низхідним потоком не піклується про значення будь-яких елементів x.dat
чи y.dat
індекси яких не були вказані arr
, код може бути оптимізований до:
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
{
int it = arr[i];
x.dat[index] = i;
y.dat[index] = i;
}
}
Таке підвищення ефективності було б неможливим, якби програмісти temp.dat
перед копіюванням вимагали чітко записати кожен елемент , у тому числі і тих, хто не переймався б цим.
З іншого боку, є деякі програми, де важливо уникати можливості витоку даних. У таких програмах може бути корисним або версія версії коду, яка є інструментом для лову будь-якої спроби копіювання неініціалізованого сховища, не зважаючи на те, чи буде він переглядати код нижче, або може бути корисним гарантія реалізації будь-якого сховища вміст якого міг би просочитися, буде нульовим або іншим чином перезаписаним неконфіденційними даними.
З того, що я можу сказати, стандарт C ++ не робить спроб сказати, що будь-яка з цих форм поведінки є достатньо корисною, ніж інша, щоб виправдати її обов'язок. Як не дивно, ця відсутність специфікацій може бути призначена для полегшення оптимізації, але якщо програмісти не зможуть використовувати будь-які слабкі гарантії поведінки, будь-які оптимізації будуть заперечуватись.