Tôi đã có chính xác trường hợp trong thư viện của chúng tôi. Chúng tôi đã có một mô-đun ánh xạ chuỗi chung có thể sử dụng các kích thước khác nhau cho chỉ mục, 8, 16 hoặc 32 bit (vì lý do lịch sử). Vì vậy, mã có đầy đủ mã như sau:
if(map->idxSiz == 1)
return ((BYTE *)map->idx)[Pos] = ...whatever
else
if(map->idxSiz == 2)
return ((WORD *)map->idx)[Pos] = ...whatever
else
return ((LONG *)map->idx)[Pos] = ...whatever
Có 100 dòng giống như vậy. Trong bước đầu tiên tôi đã thay đổi nó thành một công đoàn và tôi thấy nó dễ đọc hơn.
switch(map->idxSiz) {
case 1: return map->idx.u8[Pos] = ...whatever
case 2: return map->idx.u16[Pos] = ...whatever
case 3: return map->idx.u32[Pos] = ...whatever
}
này alowed tôi để xem rõ hơn những gì đang xảy ra và sau đó tôi có thể quyết định để loại bỏ hoàn toàn các idxSiz biến thể chỉ sử dụng 32 chỉ số bit. Nhưng điều này chỉ có thể một khi mã có thể đọc được nhiều hơn. PS: Đó chỉ là một phần nhỏ trong dự án của chúng tôi, khoảng 100 nghìn dòng mã được viết bởi những người không còn tồn tại nữa. Vì vậy, những thay đổi trong mã được dần dần để không phá vỡ các ứng dụng.
Kết luận: Ngay cả khi mọi người ít được sử dụng hơn với biến thể công đoàn, tôi thích nó hơn vì nó có thể làm cho mã nhẹ hơn để đọc. Trên các dự án lớn, điều cực kỳ quan trọng là làm cho mã dễ đọc hơn, ngay cả khi chính bạn sẽ đọc nó sau này.
Sửa: Thêm bình luận, như ý kiến không định dạng mã:
Sự thay đổi để chuyển đổi đến trước (điều này bây giờ là mã thực như nó đã được)
switch(this->IdxSiz) {
case 2: ((uint16_t*)this->iSort)[Pos-1] = (uint16_t)this->header.nUz; break;
case 4: ((uint32_t*)this->iSort)[Pos-1] = this->header.nUz; break;
}
đã được đổi thành
switch(this->IdxSiz) {
case 2: this->iSort.u16[Pos-1] = this->header.nUz; break;
case 4: this->iSort.u32[Pos-1] = this->header.nUz; break;
}
Tôi không nên kết hợp tất cả vẻ đẹp tôi đã làm trong mã và chỉ hiển thị bước đó.Nhưng tôi đã đăng câu trả lời của mình ở nhà mà tôi không có quyền truy cập vào mã số
Nguồn
2009-11-30 20:10:27
tha thứ cho các cliche, nhưng kích thước quan trọng :) –
@tinkertim và tỷ lệ cược là chúng sẽ có cùng kích thước. Trên một hệ thống intel 32 bit, cả hai sẽ mất 4 byte. về mặt kỹ thuật, void * có thể lớn hơn, nhưng nó hầu như không bao giờ (trừ khi double * lớn hơn ...) – Mikeage
Không phải tất cả các con trỏ đều có cùng kích thước bất kể loại dữ liệu mà chúng trỏ tới không? –