SORU
16 Aralık 2008, Salı


Neden't ben bir sınıfta olmayan integral statik, sabit bir üye olabilir mi?

C aşağıdaki derlenir değil fark ettim:

class No_Good {
  static double const d = 1.0;
};

Ancak mutlu çift int, işaretsiz, ya da herhangi bir tamsayı türü için değişen bir varyasyon sağlar:

class Happy_Times {
  static unsigned const u = 1;
};

Benim çözüm okumak değiştirmek için:

class Now_Good {
  static double d() { return 1.0; }
};

ve derleyici gerektiğinde satır içi kadar zeki olduğunu düşünüyorum... ama beni merak bıraktı.

Neden C tasarımcısı(ler) statik sabit bir int veya imzasız, bana izin ver ama bir çift değil ki?

Edit: visual studio 7.1 kullanıyorum (.2003 net) Windows XP.

Edit2:

Soru yanıtlandı, ama tamamlanması için, hata görüyordum:

error C2864: 'd' : only const static integral data members can be initialized inside a class or struct

CEVAP
16 Aralık 2008, Salı


Sorun bir tamsayı, derleyici ilegenellikleşimdiye kadar sürekli. bir bellek adresi oluşturmak zorunda değil Zamanında öyle bir yer yok, her çevre koduna inlined alır. Eğer hala adresini hiç alınırsa bu bellek bir yer vermeye karar verebilir (ya da eğer bir fonksiyonun sabit başvuru tarafından geçirilen ise) gerekir. Bu adresi vermek için, bazı çeviri birimi olarak tanımlanmış olması gerekiyor. Ve bu durumda, aksi takdirde birden fazla çeviri birimleri olarak tanımlanan alacağı beri tanımından bildirimi ayrı.

Hayır optimizasyonu (-O0) g kullanarak, otomatik olarak sabit bir tamsayı değişken ama sabit çift değerleri inlines. Yüksek optimizasyon seviyeleri (örneğin -O1) sabit, çiftler bu inlines. Böylece, aşağıdaki kodu -O0 -O1 ama DEĞİL derler:

// File a.h
class X
{
 public:
  static const double d = 1.0;
};

void foo(void);

// File a.cc
#include <stdio.h>

#include "a.h"

int main(void)
{
  foo();
  printf("%g\n", X::d);

  return 0;
}

// File b.cc
#include <stdio.h>

#include "a.h"

void foo(void)
{
  printf("foo: %g\n", X::d);
}

Komut satırı:

g   a.cc b.cc -O0 -o a   # Linker error: ld: undefined symbols: X::d
g   a.cc b.cc -O1 -o a   # Succeeds

Maksimum taşınabilirlik için, başlık dosyaları içinde sabitler bildirmek ve bazı kaynak bir dosya tanımlamak gerekir. Hiçbir iyileştirme, bu olmaz zarar performansı, siz olmadığınıza göre optimize neyse, ama en iyi duruma getirme etkin, bu zarar performansı, yana derleyici artık satır içi bu sabitler diğer kaynak dosyaları, sürece etkinleştir "tüm programı en iyi duruma getirme".

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007