|
virtual methods
|
|||
---|---|---|---|
#18+
Barlonea guestпропущено... А зачем он нужен, если ничего не делает? Можно не вызвать его тогда... Так это, placement new конструкторы вызывает.Спасибо, я в курсе. Не я утверждал, что placement new ничего не делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil A. Sidorov, ладно, объясняю на пальцах. Пусть тип элемента вектора T = int. Вот есть у нас кусок памяти под 4 элемента (для простоты — статический массив): Код: plaintext 1.
Пусть в векторе 3 элемента 5, 10, 33. Их вектор создал с помощью placement new: Код: plaintext 1. 2. 3.
Теперь что примерно делает оператор[]? Вот это Код: plaintext 1. 2. 3. 4.
А это точно приведёт к UB для n == 2, т.к. индексация == адресная арифметика, а она определена только в пределах массива. Никакого массива из int-ов в буфере нет.Бред. Или предъяви компилятор, в котором это работает не так как ожидается. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglБред.Аргументированно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 09:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestSiemarglБред.Аргументированно.Для тех, кто пользуется компилятором, вполне аргументировано. Религия не позволяет скомпилировать и пройтись отладчиком? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestSiemarglБред.Аргументированно.Если почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3]. для очистки совести можно завести еще переменную Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglЕсли почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3]. для очистки совести можно завести еще переменную Код: plaintext 1. 2. 3. 4. 5.
Я ему об этом уже писал 21455915 , но он не читает и ничего компилировать и проверять не хочет. Просто троллит. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemargla guestпропущено... Аргументированно.Если почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3].А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 10:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.Еще раз (сбился со счёта - в какой) - твой массив состоит из 16-ти элементов unsigned char ( unsigned char buffer[4 * sizeof(int)] ) и в нём прекрасно умещается 4 элемента любого типа размером 4 байта (UINT32, INT32 или int в моделях ILP32, I32LP64, LLP64, LP64), поэтому, для доступа к этим 4-ём элементам int ничто не мешает использовать приведенный к int* указатель на массив buffer, а также использовать арифметику указателей с обычный указателем на unsigned char: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:32 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЗатем, что дальше написано, что otherwise behavior is undefined. Вы читать-то научитесь. Вот вся фраза. "If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined" В ней утверждается,что 1) Если x массив длиной N 2) Есть выражение P равное &x[i] 3) То выражение P + j равно &x[i + j] если 0<=i+j<=n 4) А если не выполняется 0<=i+j<=n, то выражение P + j дает UB (а вовсе не "если это не массив, то UB", как вы в порядке бреда поняли ). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestЗатем, что дальше написано, что otherwise behavior is undefined. Вы читать-то научитесь. Вот вся фраза. "If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0≤i+j≤n; otherwise, the behavior is undefined" В ней утверждается,что 1) Если x массив длиной N 2) Есть выражение P равное &x[i] 3) То выражение P + j равно &x[i + j] если 0<=i+j<=n 4) А если не выполняется 0<=i+j<=n, то выражение P + j дает UB (а вовсе не "если это не массив, то UB", как вы в порядке бреда поняли )."otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Короче, если ты хочешь показать, что я принёс не ту цитату из стандарта, притащи определение арифметики указателей для случая, когда указатель не указывает на элемент массива. И пруф вот этой Anatoly Moskovskyи никакой массив тут и не требуется. Достаточно чтобы там, по вычисленному адресу, который разыменовывается, был валидный объект чуши. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemargla guestпропущено... А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.С тобой нет смысла разговаривать.Естественно. У тебя из "аргументов" только "Бред". Ни одной ссылки на стандарт. Пукнул в лужу, а когда тебе отказались верить без обоснований — слился. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestAnatoly Moskovsky"If ... if 0≤i+j≤n; otherwise, the behavior is undefined""otherwise" относится к "If".К какому из двух, говорите??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestпропущено... "otherwise" относится к "If".К какому из двух, говорите???Точку с запятой перед otherwise видишь? Что она значит? Почему там не запятая? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 11:59 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guest"otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Нет. Учите язык. Во фразе "If A, B if C; otherwise, D" otherwise относится к if C, потому что во-первых оно ближе, во вторых первый if отделен запятой, то есть это предусловия для всей оставшейся фразы. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТочку с запятой перед otherwise видишь? Что она значит? Почему там не запятая?"Ты идешь по очень тонкому льду, мой друг педигрипал" (ц) Кирпич.вводнаяIf the expression P points to element x[i] of an array object x with n elements, логический разделительthe expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j]определение эквивалентностиif 0≤i+j≤nусловие, нарушение которого даёт неопределённое поведение. P.S. А точку с запятой, обычно, ставят там, где не хотят начинать новое предложение. "А Владимир Ильич всё бреется; а мог бы и полоснуть". ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:13 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Чтобы было еще понятнее "If A, B if C; otherwise, D" надо читать так: "If A and C then B else if not (A and C) then D" ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Упс, запутался раскрывая скобки Вот так: "If A and C then B else if A and not C then D" ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guest"otherwise" относится к "If". Какое-то из условий в if не выполнено — UB. Нет. Учите язык.И вам того же. Anatoly MoskovskyВо фразе "If A, B if C; otherwise, D" otherwise относится к if CНет. Anatoly Moskovskyоно ближеВот поэтому приходится использовать точку с запятой, чтобы показать, что otherwise относится ко всему первому простому предложению сложного предложения, а не к ближайшему if. Точка с запятой разделяет (и связывает) более "масштабные" части предложения, чем запятая. Запятая внутри простого предложения, точка с запятой — для разделения (связывания) простых предложений сложного предложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovА точку с запятой, обычно, ставят там, где не хотят начинать новое предложение.Золотые слова. Подтверждает вышенаписанное мной про разделение простых предложений сложного предложения. Можно превратить сложное предложение в 2 простых, разделив вместо точки запятой точкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЧтобы было еще понятнеепринеси уже определение арифметики указателей для случая, когда указатель не указывает на элемент массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Где найти стандарт, не знаю. Попытался читать результаты гугля по "pointer arithmetic" и складывается ощущение, что a guest прав Наиболее "читаемый" текст по ссылке http://en.cppreference.com/w/cpp/language/operator_arithmetic MSDN так же, про pointer arithmetic говорит исключительно о массивах. Даже в книжке Programming in C: A Tutorial Brian W. Kernighan примеры (одна страничка) исключительно о перемещениях по массиву. IMHO note: стандарта не знаю, не читал. Но в google, что либо противоречащие мнению a.guest найти не смог. Где взять стандарт, не знаю. If any of the operands is a pointer, the following rules apply: * A pointer to non-array object is treated as a pointer to the first element of an array with size 1. * If the pointer P points to the ith element of an array, then the expressions P+n, n+P, and P-n are pointers of the same type that point to the i+nth, i+nth, and i-nth element of the same array, respectively. The result of pointer addition may also be a one-past-the-end pointer (that is, pointer P such that the expression P-1 points to the last element of the array). Any other situations (that is, attempts to generate a pointer that isn't pointing at an element of the same array or one past the end) invoke undefined behavior. * If the pointer P points to the ith element of an array, and the pointer Q points at the jth element of the same array, the expression P-Q has the value i-j, if the value fits in std::ptrdiff_t. Both operands must point to the elements of the same array (or one past the end), otherwise the behavior is undefined. If the result does not fit in std::ptrdiff_t, the behavior is undefined. * In any case, if the pointed-to type is different from the array element type, disregarding cv qualifications, at every level if the elements are themselves pointers, the behavior of pointer arithmetic is undefined. In particular, pointer arithmetic with pointer to base, which is pointing at an element of an array of derived objects is undefined. * If the value 0 is added or subtracted from a pointer, the result is the pointer, unchanged. If two pointers point at the same object or are both one past the end of the same array, or both are null pointers, then the result of subtraction is equal to (std::ptrdiff_t)0. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:52 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevГде найти стандарт, не знаю.Можно просто драфты смотреть, не обязательно покупать стандарт. Текущая версия с удобной навигацией http://eel.is/c draft/ Сборник драфтов в .pdf-формате https://github.com/cplusplus/draft/tree/master/papers ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 12:55 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestBasil A. Sidorov, ладно, объясняю на пальцах. Пусть тип элемента вектора T = int. Вот есть у нас кусок памяти под 4 элемента (для простоты — статический массив): Код: plaintext 1.
Пусть в векторе 3 элемента 5, 10, 33. Их вектор создал с помощью placement new: Код: plaintext 1. 2. 3.
Теперь что примерно делает оператор[]? Вот это Код: plaintext 1. 2. 3. 4.
А это точно приведёт к UB для n == 2, т.к. индексация == адресная арифметика, а она определена только в пределах массива. Никакого массива из int-ов в буфере нет.На самом деле, UB тут есть, но совсем в другом месте. unsigned char buffer[4*sizeof(int)] не гарантирует нужного для int выравнивания, и даже обращение к ((int *)buffer)[0] может привести к проблемам. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНа самом деле, UB тут есть, но совсем в другом месте. unsigned char buffer[4*sizeof(int)] не гарантирует нужного для int выравнивания, и даже обращение к ((int *)buffer)[0] может привести к проблемам.Считай, там есть alignas(int) и с созданием объектов с помощью placement new всё в порядке. ((int *)buffer)[0] тоже в порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЕсли почитать тот стандарт, что сам и приводил, и подумать, то (int*)buffer определен для [0..3].А если перечитать ещё раз (внимательно) и ещё подумать (подольше), то прибавление [0..3] к указателю (int*)buffer не определено, т.к. указатель (int*)buffer не является указателем на элемент массива нужного размера, т.к никакого массива из int там вообще нет.[/quot]Но вот это точно бред. С памятью, выделенной malloc, работать как с массивом вообще никак нельзя, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 13:22 |
|
|
start [/forum/topic.php?fid=57&msg=39653159&tid=2017692]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 266ms |
total: | 409ms |
0 / 0 |