Tanımları unutun
Kodunuzu kirletecekler.
bitfields?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Bunu asla kullanma . 4 inçten tasarruf etmekten çok hız ile ilgileniyorsunuz. Bit alanlarını kullanmak aslında diğer türlere erişimden daha yavaştır.
Bununla birlikte, yapılardaki bit üyelerinin pratik dezavantajları vardır. İlk olarak, bellekteki bitlerin sıralaması derleyiciden derleyiciye değişir. Ek olarak, birçok popüler derleyici , bit üyelerini okumak ve yazmak için verimsiz kod üretir ve potansiyel olarak ciddi iş parçacığı güvenliği sorunları vardır. çoğu makinenin bellekteki keyfi bit kümelerini işleyememesi nedeniyle bit alanlarıyla ilgili (özellikle çok işlemcili sistemlerde) ancak bunun yerine tam kelimeleri yüklemeli ve saklamalıdır. Örneğin, bir muteks kullanılmasına rağmen aşağıdakiler iş parçacığı açısından güvenli olmayacaktır
Kaynak: http://en.wikipedia.org/wiki/Bit_field :
Eğer için daha fazla neden ihtiyacın varsa değil bitfields kullanmak belki Raymond Chen onun sizi ikna edecek The Old New Thing mesaj: bitfields maliyet-fayda analizini boole koleksiyonu için de http://blogs.msdn.com/oldnewthing/ arşiv / 2008/11/26 / 9143050.aspx
const int?
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Bunları bir ad alanına koymak harika. CPP veya başlık dosyanızda beyan edildiyse, değerleri satır içi olacaktır. Bu değerler üzerinde anahtarı kullanabileceksiniz, ancak bu, kuplajı biraz artıracaktır.
Ah, evet: statik anahtar kelimeyi kaldırın . static, sizin yaptığınız gibi kullanıldığında C ++ 'da kullanımdan kaldırılmıştır ve uint8 bir yapı tipiyse, bunu aynı modülün birden çok kaynağı tarafından dahil edilen bir başlıkta bildirmek için buna ihtiyacınız olmayacaktır. Sonunda, kod şöyle olmalıdır:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Bu yaklaşımın sorunu, kodunuzun sabitlerinizin değerini bilmesidir, bu da kuplajı biraz artırır.
Sıralama
Sabit int ile aynı, biraz daha güçlü bir yazımla.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Yine de küresel ad alanını kirletiyorlar. Bu arada ... typedef'i kaldırın . C ++ ile çalışıyorsunuz. Bu numaralandırma ve yapı türleri, kodu her şeyden daha fazla kirletiyor.
Sonuç biraz:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Gördüğünüz gibi, numaranız genel ad alanını kirletiyor. Bu numaralandırmayı bir ad alanına koyarsanız, şöyle bir şeye sahip olursunuz:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
extern const int?
Kuplajı azaltmak istiyorsanız (yani sabitlerin değerlerini gizleyebilmek ve böylece tam bir yeniden derlemeye gerek kalmadan bunları istediğiniz gibi değiştirebilmek), int'leri başlıkta extern ve CPP dosyasında sabit olarak ilan edebilirsiniz. aşağıdaki örnekte olduğu gibi:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
Ve:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Yine de bu sabitler üzerinde switch'i kullanamazsınız. Sonunda, zehirini seç ... :-p