Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Я слышал, что в C++0x нет никаких Точек Следования, это правда?
Да, это правда.
Понятие «точка следования» было заменено комитетом ISO C++ на уточненное и дополненное понятие Отношения Следования [ДО\ПОСЛЕ].
if (this == NULL) { ... }", то тем самым пообещали компилятору, что то, что в фигурных скобках никогда исполнено не будет. Компилятор и саму проверку и весь этот код с превеликим удовольствием из программы удалит: она от этого только меньше и быстрее станет.void f(int, int);
void foo( int& x, int& y)
{
int z = x++ + y++;
f(x=1, y=1);
}
void f(int, int);
void foo( int& x, int& y)
{
int z = x+1 + y+1;
x = 1; y = 1;
f(x, y);
}
int z = 2;
z += x;
z += y;
void f(int, int);
void foo( int& x, int& y)
{
int z = x+1 + y+1;
x = 1; y = 1;
f(1, 1);
}
// i = -1;
xor i, i
sub i, 1
xor i, i
xor i, i
sub i, 1
sub i, 1
call f(i, i)
if (abs(x) < 0) { /* обработаем случай когда x == MIN_INT */ }А где нибудь есть список всех случаев UB со ссылками на стандарт?У C есть приложение J.2, где есть ссылки на все другие разделы стандарта, где описаны все случаи, которые стандарт помещает в этот раздел. У C++ вроде бы нету, нужно искать в стандарте по слову «undefined» (и то можно что-нибудь пропустить).
float с последующим чтением как int требовала явной операции синхронизации…Это http://en.cppreference.com/w/cpp/language/ub полный список?Смеётесь, что ли? Полный список — это сотни случаев разных, а там перечислены хорошо если пара десятков.
И причём там «Infinite loop without side-effects»?Об этом явно написано в стандарте:
4.7.2 Forward progress [intro.progress]То есть компилятор имеет право выкидывать циклы, которые «ничего не делают». Что-нибудь типа
1 The implementation may assume that any thread will eventually do one of the following:
(1.1) — terminate,
(1.2) — make a call to a library I/O function,
(1.3) — perform an access through a volatile glvalue, or
(1.4) — perform a synchronization operation or an atomic operation.
[ Note: This is intended to allow compiler transformations such as removal of empty loops, even when termination cannot be proven. — end note ]
for (int i=0;i<1000000;i++)
; // Do nothing
Можно просто извести. И такое: for (;;)
; // Do nothing
Тоже. Правда и GCC и clang распознают несколько наиболее распространённых циклов и их оставляют, но делать это, строго говоря, не обязаны…
Неопределенное поведение в C++