Sizeof neden derleme zamanı operatörü olarak adlandırılır?


12

Başlangıçta, bu başka bir sorunun bir parçası .

Neden sizeofderleme zamanı operatörü olarak adlandırılır? Öyle değil mi aslında bir çalışma zamanı santral? Ve eğer gerçekten bir derleme zamanı operatörü ise, farklı bilgisayarlarda aynı şekilde çalışan taşınabilir kod üretmeye nasıl yardımcı olur? Lütfen ayrıntılı olarak açıklayınız.


4
SO'da ayrıntılı olarak cevaplandı: Sizeof (x ++) neden x değerini artırmıyor?
gnat

3
Bir türün boyutunun çalışma zamanında nasıl değişeceğini düşünüyorsunuz?

@MichaelT: Bir türün örneğinin boyutu kesinlikle değişebilir - sonuçta sınıf polimorfizmi vardır. sizeof(polymorphic_ptr*)Sabit olmanın oldukça sezgisel ve aptalca olduğunu iddia ediyorum . Evet, C ++ yolu, ama yine de aptalca.
Monica'yı

@KubaOber Gerçekten. Sadece OP'nin farklı durumlarda nasıl davranması gerektiğini düşündüğünü merak ediyorum ve umarım soruyu genişletmek için bu konuda kafa karışıklığını gösterecek bazı kodlar alırım.

4
"Derleme zamanında çalıştığı için" cevabını kaldırmak için geldi, hayal kırıklığına bıraktı.
Ben Jackson

Yanıtlar:


23

sizeof()veri türünün boyutunu verir , hafızadaki o türün belirli bir örneğinin boyutunu değil.

Örneğin, çalışma zamanında değişken boyutlu bir karakter dizisi ayıran bir dize veri nesneniz varsa sizeof(), bu karakter dizisinin boyutunu belirlemek için kullanılamaz. Size sadece işaretçinin boyutunu verir.

Bir veri türünün boyutu derleme zamanında her zaman bilinir.


3
C (++) çalışma zamanı nesne meta verilerine sahip olmadığından, bu şeyleri çalışma zamanında da alamazsınız.
C. Ross

5
Kullanmak Aslında, eğer sizeofbir dizinin üzerine, sen olacaktır (eleman boyutu defa elemanlarının sayısı) dizinin boyutunu olsun. Ancak bir işaretçide kullanırsanız, yalnızca işaretçinin boyutunu elde edersiniz. Bu nedenle, bir dizinin boyutunu bilmek istediğiniz çoğu durumda, yalnızca bir işaretçiniz vardır, hepsi bu kadar kullanışlı değildir.
sepp2k

1
@Jens Soru [C ++] olarak etiketlendi ve VLA bunu C ++ standardına dönüştürmedi.
authchir

13

Tüm sizeof "çağrısı" derleme sırasında hesaplanır çünkü ve parantez atılır ve aralarında ne olursa olsun değil çalışma zamanında çalıştırın

sonuç tamamen derleyicinin kullanabileceği statik tip bilgisini temel alır


7

Sizeof neden derleme zamanı operatörü olarak adlandırılır?

Çünkü derleme zamanında, derleyici ifadenin boyutunu hesaplar ve zaman sabit değerini derleyen ikame eder.

Aslında çalışma zamanı operatörü değil mi?

Hayır sizeof. Derleyici ifadenin türünü belirleyebildiği sürece, yasal olarak yürütemeyeceğiniz (yani Tanımsız Davranışa neden olacak) ifadelerin boyutunu değerlendirmek için bile kullanabilirsiniz .

Ayrıca, C ++ 11'den önce bile constexpr, sizeofifadeleri çalışma zamanı ifadelerini kullanamayacağınız şekilde kullanabilirsiniz.

Ve eğer gerçekten bir derleme zamanı operatörü ise, taşınabilir kod üretmeye nasıl yardımcı olur ...

Türlerin boyutu farklı platformlarda değişebilir. Kullanılması sizeofsabit kodlanmış varsayımların yerine ifadelerini farklı bir platformda derlemek ve türleri boyutunu değiştirmek zaman kod kırmak anlamına gelir.


1
Eh, bunu en yararlı cevap buluyorum;). Kardeşim (erkek olduğunuzu varsayarsak), bir şüphem var. İnsanlar sizeof'in programları taşınabilir hale getirdiğini söylediklerinde , kaynak kodun tüm makinelerde hatasız olarak derlenebileceğini ve çalıştırılabilir programın herhangi bir makinede çalıştırılabileceği anlamına gelmediğini söylemek istiyor musunuz ? Sağ ? Bu doğruysa, şüphem gerçekten netleşir.
Barışçıl Kodlayıcı

1
Evet, kod taşınabilir, yani her platform için (farklı) doğru bir ikili derleyebilirsiniz.
Yararsız

5

C ++, nesnelerin meta verilerini çalışma zamanında depolamaz, bu nedenle boyut denetimi derleme zamanı olmalıdır. C ++ 'ın boyutu nasıl doğrulamadığına dair bir örnek için, intrastgele boyutta bir dizi bildirin ve sonuna kadar okuyun. Eğer şanslıysanız bir alırsınız segfaultama daha büyük olasılıkla anlamsızca okursunuz, çünkü C ++ dizinizin boyutunu izlemez.

Bkz. C / C ++ program seg-error bir dizinin (UNIX) sonunu okuyabilir mi? SO'dan bir örnek için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.