Я считаю, что все это определенное поведение, которое будет продолжать работать в любой реализации.Глядя на различную документацию для valarray, кажется, что она должна быть законной, чтобы все остальное в ::std::valarray
оставалось верным.Обнаженные указатели на элементы должны оставаться в силе до тех пор, пока не будет вызвана функция-член resize
или пока не будет уничтожено valarray
.
Единственный реальный вопрос заключается в том, требуется ли valarray
для хранения его элементов.смежно или нет.И я нашел ответ на этот вопрос в сообщении .Я приведу его здесь:
Да, valarray также использует непрерывное хранилище.Специальная формулировка из стандарта ($ 26.3.2.3 / 3): выражение & a [i + j] == & a [i] + j оценивается как истинное для всех size_t i и size_t j, так что i + j меньше, чемдлина неконстантного массива a.
Конечно, срезы по-прежнему нельзя использовать напрямую со стандартными алгоритмами, хотя создание итератора срезов не должно быть слишком сложным.Было бы довольно легко сделать двунаправленный, но гораздо сложнее (сложная математика, которую вы должны правильно понять) создать итератор произвольного доступа.
Разница между двумя указателями становится (как у кого-то еще)сказал) ::std::ptrdiff_t
.Это будет другой тип на разных платформах.Я использую gcc под 64-битной Fedora 14, и тип для меня long
.В этом «преобразовании типов» нет накладных расходов.Это даже не обращение на самом деле.Компилятор просто выполняет вычитание, как если бы два указателя были обычными старыми числами, а результат - простым старым числом некоторого типа.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Т по типу * * * * * * * * * * * * * * * * * * * * * * * * * Использовать для этого типа ::std::ptrdiff_t
, чтобы убедиться, что используемый тип числа достаточно большой, чтобы удерживать разницу между любыми двумя указателями в системе.