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);
It may be significantly slower to access unaligned memory (as in, several times slower).
Not all platforms even support unaligned access - x86 and x64 do, but ia64 (Itanium) does not, for example.
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.
Это очень сильно зависит от архитектуры чипа. x86 и POWER очень снисходительны, Sparc, Itanium и VAX выдают разные исключения.