SORU
19 Aralık 2008, Cuma


Diziler veya std::kullanma C , ne'performans farkının s?vektörler

C Rotamız yeni projeler üzerinde C diziler artık kullanmamanızı öneririm. Stroustroup bildiğim kadarıyla diziler kullanmamayı kendini gösteriyor. Ama ciddi performans farkı var mıdır?

CEVAP
19 Aralık 2008, Cuma


new C diziler (dinamik diziler kullanarak) kullanımından kaçınılmalıdır. Boyutu takip etmek sorun var, ve bunları el ile silin ve temizlik her tür yapmak gerekir.

Üzerinde dizileri kullanarak yığını da denetleme aralığı yok çünkü cesareti ve çevresinde dizinin geçen büyüklüğü (işaretçi dönüşüm dizi) hakkında herhangi bir bilgi kaybedersiniz. Küçük bir sınıf C bir dizi sarar ve size İşlev ve kullanımına üzerinden yineleme sağlayan bu durumda, boost::array kullanmalısınız.

Şimdi::std vektör C vs yerli diziler(internetten alınan):

// Comparison of assembly code generated for basic indexing, dereferencing, 
// and increment operations on vectors and arrays/pointers.

// Assembly code was generated by gcc 4.1.0 invoked with  g   -O3 -S  on a 
// x86_64-suse-linux machine.

#include <vector>

struct S
{
  int padding;

  std::vector<int> v;
  int * p;
  std::vector<int>::iterator i;
};

int pointer_index (S & s) { return s.p[3]; }
  // movq    32(%rdi), %rax
  // movl    12(%rax), x
  // ret

int vector_index (S & s) { return s.v[3]; }
  // movq    8(%rdi), %rax
  // movl    12(%rax), x
  // ret

// Conclusion: Indexing a vector is the same damn thing as indexing a pointer.

int pointer_deref (S & s) { return *s.p; }
  // movq    32(%rdi), %rax
  // movl    (%rax), x
  // ret

int iterator_deref (S & s) { return *s.i; }
  // movq    40(%rdi), %rax
  // movl    (%rax), x
  // ret

// Conclusion: Dereferencing a vector iterator is the same damn thing 
// as dereferencing a pointer.

void pointer_increment (S & s) {   s.p; }
  // addq    $4, 32(%rdi)
  // ret

void iterator_increment (S & s) {   s.i; }
  // addq    $4, 40(%rdi)
  // ret

// Conclusion: Incrementing a vector iterator is the same damn thing as 
// incrementing a pointer.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • HBO

    HBO

    17 Mayıs 2006
  • KoreanFrogMania님의 채널

    KoreanFrogMa

    18 Aralık 2011