2015-06-16 21 views
6

C++ dili aşağıdaki kodun yazdırılmasına izin veriyor mu örn. 16 yerine 1 mi? Diğer cevaplara göre evet tahmin ediyorum ama bu dava özellikle ele alınmamış gibi görünüyor.Bir C++ sınıfındaki referanslar için depolama alanı optimize edilebilir mi?

Bir referans muhafazası da

derleyici kadar ne karar verecek olan belirtilmemiş gerektirir olsa da olmasa da:

#include "iostream" 
#include "cstdlib" 
using namespace std; 

struct as_array { 
    double &a, &b; 

    as_array(double& A, double& B) 
     : a(A), b(B) {} 

    double& operator[](const int i) { 
     switch (i) { 
     case 0: 
      return this->a; 
      break; 
     case 1: 
      return this->b; 
      break; 
     default: 
      abort(); 
     } 
    } 
}; 

int main() { 
    cout << sizeof(as_array) << endl; 
} 
+0

* "Ancak bu vaka özellikle ele alınmamış gibi görünüyor" * - özellikle sizin durumunuzla ilgili ne hissettiğinizi hissetmiyor musunuz? Sadece referanslar sınıf üyesi mi? –

+1

Bir şey mi eksik? “A” ve “b” bağımsız referanslar olduğundan, derleyici iki gösterici için alan ayırmak yerine, bu yapıyı nasıl uygular? –

+0

> Özellikle sizin durumunuzla ilgili olarak kapsanmamış hissediyor musunuz? Evet, referansların sınıf üyeleri olduğu gerçeğiydi – user3493721

cevap

5

Standart [dcl.ref] altında diyor Bir nesnenin boyutu, bu yüzden sıfır olmayan herhangi bir sayıyı buradan alabilirsiniz.

Aynı zamanda, bir if kuralı (en iyi duruma getirmek için izin verilir) de vardır. Bu nedenle, derleyicinin bu referanslar için depolamayı kullanması ve yalnızca referansların kullanılması gerektiği durumlarda yasal olması gerekir.

Tüm bunları söyledikten; istikrarlı bir ABI'ye sahip olmak için hala bir derleyicinin bu referanslara depolama atamasını beklerdim.

2

Derleyicinin, C++ Standardında belirtilmeyen başvuru davranışlarını - nerede ve nasıl depolandıklarını da içerecek şekilde - uygulanma şekli. Sonuç olarak, bazı derleyici sorduğunuz gibi "16 yerine 1 yerine" yazdırabilir.

Ayrı olarak, return ing öğesinden sonra break'a ihtiyacınız yoktur.

2

Ben

cout << sizeof(as_array) << endl; 

her zaman iki işaretçiler verilen makine, belki paketleme kurallarını yerine getirmek için boşlukları ile genişletilmiş üzerinde iki katına çıkması için gereken depolama döndüren inanıyoruz. Optimizasyon, verilen veri yapılarının depolanmasının boyutunu azaltmak anlamına gelir. Bunun yerine derleyici, kodunuzu gerçek dünya senaryosunda tamamen optimize edebilir. derleyici değerler kodu ile nasıl işlendiğini bildiği için

double a=100; 
double b=200; 
as_array arr(&a, &b); 
std::cout << arr[0] << std::endl; 

tamamen uzak yapısı için depolama optimize sonuçlanabilir: kodu var ise. Ancak, sizeof'in (arr) çıktısı, size yapının teorik boyutunu verir.

Neyse: Daha iyi sonuç elde etmek istiyorsanız, daha iyi kod yazmalısınız! const ise const yöntemlerini kullanın! Eğer mümkünse C++ 11 kullanıyorsanız constexpr kullanın.

+1

Size neye inanmanız gerekiyor? – juanchopanza

+1

Yapının tanımı, kullanımdan bağımsız bir ilk adımdır. Bu yüzden, derleyiciyi bu teorik boyut için "sorarsanız", bu durumda neyin iyimser olması gerekir? Kullanım durumunu bilmeden en iyi duruma getirilebilecek hiçbir şey yoktur. Ben bir dil avukatı değilim, ama verilen boyut başka bir şey bilmeden nasıl optimize edildi? – Klaus

İlgili konular