SORU
11 EYLÜL 2014, PERŞEMBE


Neden üye değişkenleri olmadan C sınıfları yer kaplar?

Hem MSVC ve GCC derleyicileri eğer sınıf üyesi değişkenleri (veya sadece statik üye Değişkenler) ile bir yüklem bile her sınıf, örnek başına en az bir bayt ayrılamadı buldum. Aşağıdaki kod noktayı gösterir.

#include <iostream>

class A
{
public:
   bool operator()(int x) const
   {
      return x>0;
   }
};

class B
{
public:
   static int v;
   static bool check(int x)
   {
      return x>0;
   }
};

int B::v = 0;

void test()
{
   A a;
   B b;
   std::cout << "sizeof(A)=" << sizeof(A) << "\n"
             << "sizeof(a)=" << sizeof(a) << "\n"
             << "sizeof(B)=" << sizeof(B) << "\n"
             << "sizeof(b)=" << sizeof(b) << "\n";
}

int main()
{
   test();
   return 0;
}

Çıkış:

sizeof(A)=1
sizeof(a)=1
sizeof(B)=1
sizeof(b)=1

Benim sorum neden derleyici buna ihtiyacı var mı? Aklıma gelen tek sebep, tüm üye var onları işaretçiler işaretçiler karşılaştırarak tip A veya B iki üyesi arasında ayrım yapabiliriz çok farklı emin olun. Ama bunun maliyeti, boyutu küçük kaplar ile ilgili oldukça ciddi. Olası veri uyumu göz önüne alındığında, var olmadan sınıf başına 16 bayt (?!). Genellikle birkaç int değerler tutacak özel bir kap var sanırım. Daha sonra bu kaplar, bir dizi (yaklaşık 1000000 üyeleri ile) düşünün. Yükü 16*1000000 olacak! Olabilir normal bir durum bir karşılaştırma yüklem üye değişkeni içinde saklanan kapsayıcı bir sınıftır. Bir çağırırken ne beklenmelidir aynı zamanda, sınıfın bir örneği her zaman bir yer işgal gerektiğini dikkate alarak, () (değer) ?

CEVAP
11 EYLÜL 2014, PERŞEMBE


Gerekli C standart bir sabit tatmin etmek için değil: aynı türden her C nesnesi benzersiz bir adres tanımlanabilir. olması gerekiyor

Eğer nesneleri boşluk aldı, sonra bir dizi öğeleri aynı adresi paylaşmak istiyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • Excel Functions

    Excel Functi

    4 NİSAN 2010
  • tatermoog

    tatermoog

    2 AĞUSTOS 2006