ลืมคำจำกัดความ
พวกเขาจะสร้างมลพิษให้กับรหัสของคุณ
bitfields?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
อย่าใช้สิ่งนั้น คุณกังวลเกี่ยวกับความเร็วมากกว่าการประหยัด 4 ints การใช้ฟิลด์บิตนั้นช้ากว่าการเข้าถึงประเภทอื่น ๆ
อย่างไรก็ตามสมาชิกบิตในโครงสร้างมีข้อบกพร่องในทางปฏิบัติ ประการแรกลำดับของบิตในหน่วยความจำจะแตกต่างกันไปในแต่ละคอมไพเลอร์ถึงคอมไพเลอร์ นอกจากนี้คอมไพเลอร์ยอดนิยมจำนวนมากยังสร้างโค้ดที่ไม่มีประสิทธิภาพสำหรับการอ่านและเขียนสมาชิกบิตและอาจมีปัญหาด้านความปลอดภัยของเธรดที่รุนแรงเกี่ยวข้องกับฟิลด์บิต (โดยเฉพาะในระบบมัลติโปรเซสเซอร์) เนื่องจากเครื่องส่วนใหญ่ไม่สามารถจัดการกับชุดบิตในหน่วยความจำโดยพลการ แต่ต้องโหลดและเก็บทั้งคำแทน เช่นสิ่งต่อไปนี้จะไม่ปลอดภัยต่อเธรดแม้ว่าจะใช้ mutex ก็ตาม
ที่มา: http://en.wikipedia.org/wiki/Bit_field :
และหากคุณต้องการเหตุผลเพิ่มเติมในการไม่ใช้ bitfields บางทีRaymond Chenอาจโน้มน้าวคุณในThe Old New Thing Post: การวิเคราะห์ผลประโยชน์ด้านต้นทุนของ bitfields สำหรับชุดบูลีนที่http://blogs.msdn.com/oldnewthing/ เก็บ / 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;
}
การใส่ไว้ในเนมสเปซนั้นเจ๋งมาก หากมีการประกาศใน CPP หรือไฟล์ส่วนหัวของคุณค่าของค่าเหล่านี้จะถูกแทรก คุณจะสามารถใช้สวิตช์กับค่าเหล่านั้นได้ แต่จะเพิ่มการมีเพศสัมพันธ์เล็กน้อย
อ่าใช่: ลบคำหลักแบบคงที่ คงไม่ได้รับการสนับสนุนใน C ++ เมื่อใช้เหมือนที่คุณทำและถ้า uint8 เป็นประเภท buildin คุณไม่จำเป็นต้องใช้สิ่งนี้เพื่อประกาศสิ่งนี้ในส่วนหัวที่รวมโดยแหล่งที่มาของโมดูลเดียวกันหลายแหล่ง ในท้ายที่สุดรหัสควรเป็น:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
ปัญหาของแนวทางนี้คือรหัสของคุณรู้ค่าคงที่ของคุณซึ่งจะเพิ่มการมีเพศสัมพันธ์เล็กน้อย
enum
เช่นเดียวกับ const int ด้วยการพิมพ์ที่ค่อนข้างแรงกว่า
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
แม้ว่าพวกเขายังคงสร้างมลพิษให้กับเนมสเปซทั่วโลก โดยวิธีการ ... ลบ typedef คุณกำลังทำงานใน C ++ ประเภทของ enums และโครงสร้างเหล่านี้ก่อให้เกิดมลพิษต่อรหัสมากกว่าสิ่งอื่นใด
ผลที่ได้คือ:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
อย่างที่คุณเห็น enum ของคุณสร้างมลพิษให้กับเนมสเปซทั่วโลก หากคุณใส่ enum นี้ในเนมสเปซคุณจะมีสิ่งต่อไปนี้:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
int const ภายนอก?
หากคุณต้องการลดการมีเพศสัมพันธ์ (เช่นสามารถซ่อนค่าของค่าคงที่และแก้ไขได้ตามต้องการโดยไม่จำเป็นต้องมีการคอมไพล์ใหม่ทั้งหมด) คุณสามารถประกาศ ints เป็น extern ในส่วนหัวและเป็นค่าคงที่ในไฟล์ CPP ดังตัวอย่างต่อไปนี้:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
และ:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
คุณจะไม่สามารถใช้สวิตช์กับค่าคงที่เหล่านั้นได้ ในท้ายที่สุดเลือกพิษของคุณ ... :-p