Yerleşik diziyi std/tr1/boost :: array ile değiştirmek her zaman güvenli midir?

boost::array (or the tr1or std version) offer some nice additional features over a built-in array.

Şimdiye kadar, kod tabanımız yalnızca yerleşik diziler içerir, örneğin (yukarı, ancak stil eşleşir):

WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
  memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
  ...

Bence bu fikir alacak.

Şimdi, benim sorum, koddaki yerlerin, boost :: array 'da düşmesinin (diğer değişiklikler nedeniyle) anlamlı olacağı, array ' in% 100 olduğu Yerleşik dizi için drop-in korunan semantik? (Olası derleyici hataları TAMAM - sadece sessiz davranış değişiklikleri beni rahatsız ediyor.)

Yani, yukarıdaki kodun yeniden yazılması (örneğin) olabilir :

boost::array m_lastReadFlags;

and the memcpy (possibly adapted to use c_array()or data()) and other array-like access would remain the same? Yes, of course I could also replace the local buffer by an array and remove the memcpy or use std::copy or something like that, but the point of this question is about the compatibility of built-in arrays and the array class.


Güncelleme: Özellikle beni rahatsız eden bir şey, yerleşik dizilerin işaretçi olarak kullanıldığı yerlerdir ( memcpy durumunda olduğu gibi). Tüm olaylar tarafından yakalanacak mı derleyici/doğru işlendi?

Görev ne olacak?

T arr1[N];//or array
T arr2[N];//or array
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...
5

1 cevap

Evet, bu iyi olmalı, çünkü array sınıfı otomatik bir dizi için bir sarıcıdır. Köşeli parantez ile aynı erişim sözdizimine sahiptir ve işaretçiye ulaşmanız gerekirse, bunu nasıl yapacağınızı bilirsiniz. Her yerde std :: copy kullanabilir ve yineleyicileri kullanabilirsiniz; Şanslar, bunun memcpy tarafından yine de uygulanacağıdır.

array sınıfı aggregate type (önemsiz olmayan kurucular/yıkıcı/atama yok) olduğundan, geleneksel birleştirme (brace) başlatıcısı ile başlatabilirsiniz. düz dizi.

5
katma