LINUX.ORG.RU

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

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

Раст гарантировал Феде что это точно не его косяк. И опираясь на эту гарантию, Федя знает кому пойдет бить морду.

есть и более интересные случаи: условный unsafe

дело в том, что иногда что-то safe, но только при определенных условиях

например, ЕСЛИ известно, что массивы х и у имеют одинаковую длину, и массив у порезан на две части у1 и у2, ТО тогда можно безопасно in-place порезать х на две часть х1 и х2, длины которых равны длинам у1 и у2

как оформить в виде функции

unsafe порезать_х_на_два_массива_длиной_как_y1_и_у2(x, y1, y2) { .... } ???

варианты:

1. эта функция не проверяет в рантайме «длина(х) == длина(у1) + длина(у2)»; тогда, вообще говоря, использующий ее safe-раст-код будет опасным, т.е. определять такую функцию нельзя (конечно, правильно написанный использующий ее код будет безопасным, но чем это лучше си?)

2. эта функция проверяет в рантайме «длина(х) == длина(у1) + длина(у2)», и если не так, то выбрасывает исключение; тогда, если компилятор не допрет, что эту проверку в рантайме можно optimize out (а это вероятно), то будут тормоза и дополнительное исключение в сигнатуре функции, которое на самом деле при правильном вызове этой функции никогда не реализуется

оба варианта плохи

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

Раст гарантировал Феде что это точно не его косяк. И опираясь на эту гарантию, Федя знает кому пойдет бить морду.

есть и более интересные случаи: условный unsafe

дело в том, что иногда что-то safe, но только при определенных условиях

например, ЕСЛИ известно, что массивы х и у имеют одинаковую длину, и массив у порезан на две части у1 и у2, ТО тогда можно безопасно in-place порезать х на две часть х1 и х2, длины которых равны длинам у1 и у2

как оформить в виде функции

unsafe порезать_х_на_два_массива_длиной_как_y1_и_у2(x, y1, y2) { .... } ???

варианты:

1. эта функция не проверяет в рантайме «длина(х) == длина(у1) + длина(у2)»; тогда, вообще говоря, использующий ее safe-раст-код будет опасным, т.е. определять такую функцию нельзя (конечно, правильно написанный использующий ее код будет безопасным, но чем это лучше си?)

2. эта функция проверяет в рантайме «длина(х) == длина(у1) + длина(у2)», и если не так, то выбрасывает исключение; тогда, если компилятор не допрет, что эту проверку в рантайме можно optimize out (а это вероятно), то будут тормоза и дополнительное исключение, которое на самом деле при правильном вызове этой функции никогда не реализуется

оба варианта плохи

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

Раст гарантировал Феде что это точно не его косяк. И опираясь на эту гарантию, Федя знает кому пойдет бить морду.

есть и более интересные случаи: условный unsafe

дело в том, что иногда что-то safe, но только при определенных условиях

например, ЕСЛИ известно, что массивы х и у имеют одинаковую длину, и массив у порезан на две части у1 и у2, ТО тогда можно безопасно in-place порезать х на две часть х1 и х2, длины которых равны длинам у1 и у2

как оформить в виде функции

unsafe порезать_х_на_два_массива_длиной_как_y1_и_у2(x, y1, y2) { .... } ???

варианты:

1. эта функция не проверяет в рантайме «длина(х) == длина(у1) + длина(у2)»; тогда, вообще говоря, использующий ее safe-раст-код будет опасным, т.е. определять такую функцию нельзя (конечно, правильно написанный использующий ее код будет безопасным, но чем это лучше си?)

2. эта функция проверяет в рантайме «длина(х) == длина(у1) + длина(у2)», и если не так, то выбрасывает исключение; тогда, если компилятор не допрет, что эту проверку в рантайме можно выкинуть (а это вероятно), то будут тормоза и дополнительное исключение, которое на самом деле при правильном вызове этой функции никогда не реализуется

оба варианта плохи

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

Раст гарантировал Феде что это точно не его косяк. И опираясь на эту гарантию, Федя знает кому пойдет бить морду.

есть и более интересные случаи: условный unsafe

дело в том, что иногда что-то safe, но только при определенных условиях

например, ЕСЛИ известно, что массивы х и у имеют одинаковую длину, и массив у порезан на две части у1 и у2, ТО тогда можно безопасно in-place порезать х на две часть х1 и х2, длины которых равны длинам у1 и у2

как оформить в виде функции

unsafe порезать_х_на_два_массива_длиной_как_y1_и_у2(x, y1, y2) { .... } ???

варианты:

1. эта функция не проверяет в рантайме «длина(х) == длина(у1) + длина(у2)»; тогда, вообще говоря, использующий ее safe-раст-код будет опасным, т.е. определять такую функцию нельзя (конечно, правильно написанный код будет безопасным, но чем это лучше си?)

2. эта функция проверяет в рантайме «длина(х) == длина(у1) + длина(у2)», и если не так, то выбрасывает исключение; тогда, если компилятор не допрет, что эту проверку в рантайме можно выкинуть (а это вероятно), то будут тормоза и дополнительное исключение, которое на самом деле при правильном вызове этой функции никогда не реализуется

оба варианта плохи