Невыровненный доступ к памяти всегда вызывает ошибки шины?

Doug T. ответил на Ваш вопрос приятно. Я скажу Вам о intrusive_ptr. Возможно, можно использовать его в проекте также.

, Если у Вас есть некоторая библиотека C, которая уже имеет подсчет ссылок, но необходимо вручную вызвать те функции, можно использовать boost::intrusive_ptr также, и предоставить надлежащие определения для его add_ref и выпустить функции. intrusive_ptr найдет и назовет их. Они ответственны, чтобы увеличить подсчет ссылок и постепенно уменьшить его, освобождая ресурс когда необходимый:

void intrusive_ptr_add_ref(foo *f) {
    lib_add_ref(f);
}

void intrusive_ptr_release(foo *f) {
    if(lib_dec_ref(f) == 0) 
        lib_free(f);
}

Тогда можно просто создать объекты из необработанных указателей типа foo*. intrusive_ptr , вызовет функции, когда копировал/разрушал:

intrusive_ptr f(lib_alloc());

// can wrap raw pointers too, which already may be referenced somewhere else
foo *p = get_foo_from_somewhere();
function_taking_intrusive_ptr(p);

9
задан Peter Mortensen 7 June 2012 в 16:22
поделиться

2 ответа

  1. It may be significantly slower to access unaligned memory (as in, several times slower).

  2. Not all platforms even support unaligned access - x86 and x64 do, but ia64 (Itanium) does not, for example.

  3. A compiler can emulate unaligned access (VC++ does that for pointers declared as __unaligned on ia64, for example) - by inserting additional checks to detect the unaligned case, and loading/storing parts of the object that straddle the alignment boundary separately. That is even slower than unaligned access on platforms which natively support it, however.

13
ответ дан 4 December 2019 в 10:33
поделиться

Это очень сильно зависит от архитектуры чипа. x86 и POWER очень снисходительны, Sparc, Itanium и VAX выдают разные исключения.

5
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: