Quên định nghĩa
Họ sẽ làm ô nhiễm mã của bạn.
bitfield?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Đừng bao giờ sử dụng nó . Bạn quan tâm đến tốc độ hơn là tiết kiệm 4 ints. Sử dụng các trường bit thực sự chậm hơn so với truy cập vào bất kỳ loại nào khác.
Tuy nhiên, các thành viên bit trong structs có nhược điểm thực tế. Đầu tiên, thứ tự các bit trong bộ nhớ thay đổi từ trình biên dịch sang trình biên dịch. Ngoài ra, nhiều trình biên dịch phổ biến tạo mã không hiệu quả để đọc và ghi các thành viên bit , và có các vấn đề an toàn luồng nghiêm trọng liên quan đến các trường bit (đặc biệt là trên các hệ thống đa bộ xử lý) do hầu hết các máy không thể điều khiển các bộ bit tùy ý trong bộ nhớ, nhưng thay vào đó phải tải và lưu trữ toàn bộ từ. ví dụ như sau đây sẽ không an toàn cho chuỗi, mặc dù sử dụng mutex
Nguồn: http://en.wikipedia.org/wiki/Bit_field :
Và nếu bạn cần thêm lý do để không sử dụng bitfield, có lẽ Raymond Chen sẽ thuyết phục bạn trong The Old New Thing Post: Phân tích lợi ích chi phí của bitfield cho một bộ sưu tập booleans tại http://bloss.msdn.com/oldnewthing/ lưu trữ / 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;
}
Đặt chúng trong một không gian tên là mát mẻ. Nếu chúng được khai báo trong CPP hoặc tệp tiêu đề của bạn, giá trị của chúng sẽ được nội tuyến. Bạn sẽ có thể sử dụng chuyển đổi trên các giá trị đó, nhưng nó sẽ tăng nhẹ khớp nối.
À, vâng: xóa từ khóa tĩnh . static không được dùng trong C ++ khi bạn sử dụng và nếu uint8 là loại dựng, bạn sẽ không cần điều này để khai báo điều này trong một tiêu đề được bao gồm bởi nhiều nguồn của cùng một mô-đun. Cuối cùng, mã phải là:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Vấn đề của phương pháp này là mã của bạn biết giá trị của các hằng số của bạn, làm tăng nhẹ khớp nối.
enum
Giống như const int, với một kiểu gõ mạnh hơn.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Họ vẫn đang gây ô nhiễm không gian tên toàn cầu, mặc dù. Bằng cách này ... Loại bỏ typedef . Bạn đang làm việc trong C ++. Những typedefs của enums và structs đang làm ô nhiễm mã hơn bất cứ thứ gì khác.
Kết quả thật tuyệt vời:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Như bạn thấy, enum của bạn đang gây ô nhiễm không gian tên toàn cầu. Nếu bạn đặt enum này trong một không gian tên, bạn sẽ có một cái gì đó như:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
bên ngoài const int?
Nếu bạn muốn giảm khớp nối (nghĩa là có thể ẩn các giá trị của hằng số, và vì vậy, hãy sửa đổi chúng theo ý muốn mà không cần biên dịch lại đầy đủ), bạn có thể khai báo ints là extern trong tiêu đề và là hằng số trong tệp CPP , như trong ví dụ sau:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
Và:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Tuy nhiên, bạn sẽ không thể sử dụng chuyển đổi trên các hằng số đó. Vì vậy, cuối cùng, chọn chất độc của bạn ... :-p