aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Жаль, что не сохранил дизасм для неверующих. Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило. Что ровным счетом ничего не доказывает. Конкретную причину abort'а нашли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба непонятно куда из непонятно откуда чудесным образом всё починило. Вот и разбирались-бы с непонятками, а memcpy() это, так сказать, святое :) и при этом достаточно простое, дабы уже лет 30 не содержать ошибок ни в одной из реализаций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Вот и разбирались-бы с непонятками, а memcpy() это, так сказать, святое :) и при этом достаточно простое, дабы уже лет 30 не содержать ошибок ни в одной из реализаций. Согласен, что простое... Я и не утверждаю что в memcpy есть ошибка, уверен что такие вещи сто раз отладили. Я вот что пытаюсь донести. Есть пердположение, что компилятор лепит в проект несколько реализаций данной функции, в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)? И стоит ему потерять (в результате действий программиста) атрибут packed для какой-нибудь структуры и он запросто применит пословное копирование вместо побайтного(имеет полное право на оптимизацию). И тут то и случится abort именно внутри memcpy. Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Есть пердположение, что компилятор лепит в проект несколько реализаций данной функции, в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)? Реализация одна. Да и какой смысл делать несколько, если использовать их можно будет только когда оба адреса константны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину. Странный вывод. Вопрос на самом деле шире - дилемма между скоростью и надежностью: 1. *(U32*) xxxx = zz; - это быстро но чревато абортом. 2. memcpy - медленно и надежно, от Align Exception'а - это самая лучшая защита, если скорость не жмет. Сказки про глючный memcpy травить не нужно, т.к. ничто не мешает послать библиотечку куда подальше и написать свой "безглючный" вариант memcpy. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину. От абортов вообще нельзя защищаться. Их просто не должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Сказки про глючный memcpy травить не нужно, т.к. ничто не мешает послать библиотечку куда подальше и написать свой "безглючный" вариант memcpy. Ткните пальцем где я написал, о том что memcpy глючит??? :maniac: Читать мой пост до полного осознания того, что я написал, прежде чем лицом об асфальт возить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Ткните пальцем где я написал, о том что memcpy глючит??? :maniac: вот здесь Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило. вот здесь В упор не вижу своих слов... memcpy глючит. Ненадо за меня додумывать. сделал дизасм проекта с memcpy, с несколькими экземплярами memcpy я оказался неправ, но всё равно основное то копирование идёт пословно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба сделал дизасм проекта с memcpy, с несколькими экземплярами memcpy я оказался неправ, но всё равно основное то копирование идёт пословно. Ну дык слова-то выровнены. И "сковырнуть" memcpy невыровненными адресами никак нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Ну дык слова-то выровнены. И "сковырнуть" memcpy невыровненными адресами никак нельзя. void zuzu(int * to, int const * from) { memcpy(to, from, sizeof(int)); } нужна оптимизация с интрисик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба нужна оптимизация с интрисик. Поясните мысль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Поясните мысль. Тут у меня не на чем сделать листинг, но при оптимизации по скорости с интрисик код получится такой же как от *to = *from, если нужно скопировать 3 int, то код будет такой же как от to[0] = from[0]; to[1] = from[1]; to[2] = from[2]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Понятно. Ну, это уже дела и проблемы оптимизатора - memcpy ведь как таковой нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)? 5, 6, 7, 8, 9...... а еще начинающиеся с 0,1,2,.... а еще заканчивающиеся на 0,1,2,3.... :) :) Вот, кода реализация в IAR была какая-то тормозная пользовал вместо библиотечной такое //--------------------------------------------------------------------------- // void *(memcpy)(void *p1, const void *p2, size_t n) // Copy char p2[n] to p1[n] //--------------------------------------------------------------------------- memcpy: teq r2,#0 // Is p1 == 0 ? bxeq lr // If p1 == 0, return stmdb sp!,{lr} // Push return address mov r12,r0 // Copy pointer p1 cmp r2,#8 // Is buffer long or short? ble byteserial // Jump if n <= 8 sub r3,r0,r1 // Compare pointers p1, p2 tst r3,#3 // Strings aligned same? bne byteserial // Jump if buffers not aligned // Both strings are similarly aligned WRT word boundaries. // At least a portion of the data can be copied an entire // word at a time, which is faster than copying bytes. wordserial: ands r3,r0,#3 // Check byte alignment beq wordaligned // Jump if p1, p2 word-aligned rsb r3,r3,#4 // m = no. of odd initial bytes sub r2,r2,r3 // n = n - m // If the two buffers do not begin on word boundaries, begin // by copying the odd bytes that precede the first full word. preloop: ldrb lr,[r1],#1 // Read byte from source subs r3,r3,#1 // --m (decrement loop count) strb lr,[r12],#1 // Write byte to destination bne preloop // Loop if more bytes to move wordaligned: #if WORDS8_TRANSFER == 1 movs r3,r2,asr #5 // Any chunks of 8 words? beq octsdone // Jump if no 8-word chunks and r2,r2,#0x1F // Subtract chunks from n stmdb sp!,{r4-r10} // Save registers on stack // The strings are long enough that we can transfer at least // some portion of the data in 8-word chunks. octloop: ldmia r1!,{r4-r10,lr} // Load 8 words from source subs r3,r3,#1 // More 8-word chunks to move? stmia r12!,{r4-r10,lr} // Write 8 words to destination bne octloop // Loop if more chunks ldmia sp!,{r4-r10} // Restore registers from stack octsdone: #endif movs r3,r2,asr #2 // Any more whole words to move? beq wordsdone // Jump if no more whole words // Copy as much of the remaining data as possible one word at // a time. wordloop2: ldr lr,[r1],#4 // Read next word from source subs r3,r3,#1 // Decrement word count str lr,[r12],#4 // Write next word to destination bne wordloop2 // Loop while more words to move wordsdone: ands r2,r2,#3 // Any last bytes to transfer? beq theend // Return if already done // The two strings do not end on word boundaries. // Copy the remaining data one byte at a time. byteserial: ldrb lr,[r1],#1 // Read byte from source subs r2,r2,#1 // --n (decrement loop count) strb lr,[r12],#1 // Write byte to destination bne byteserial // Loop if more bytes to move theend: ldmia sp!,{lr} // Return bx lr но всё равно основное то копирование идёт пословно. Зависит от реализации, пример, когда не только пословно, выше (под ключем WORDS8_TRANSFER) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться