Cá nhân tôi chống lại việc tạo mảng lúc tạo. Hãy xem xét hai đoạn mã sau đây.
char buffer[1024] = {0};
for (int i = 0; i < 1000000; ++i)
{
// Use buffer
}
vs
for (int i = 0; i < 1000000; ++i)
{
char buffer[1024] = {0};
// Use buffer
}
Trong ví dụ đầu tiên tại sao bận tâm khởi đệm kể từ lần thứ hai xung quanh bộ đệm vòng lặp không còn 0 khởi tạo? Việc sử dụng bộ đệm của tôi phải hoạt động mà không có nó được khởi tạo cho tất cả trừ lần lặp đầu tiên. Tất cả các khởi tạo không được tiêu thụ thời gian, bloat mã và lỗi tối nghĩa nếu thông thường tôi chỉ đi qua vòng lặp một lần.
Mặc dù tôi có thể xác định lại mã là ví dụ thứ hai, tôi có thực sự muốn khởi tạo bộ đệm trong vòng lặp nếu tôi có thể viết lại mã của mình để không cần thiết không?
Tôi nghi ngờ hầu hết các trình biên dịch những ngày này có các tùy chọn để điền các biến chưa được khởi tạo với các giá trị không 0. Chúng tôi chạy tất cả các bản dựng lỗi của chúng tôi theo cách này để giúp phát hiện việc sử dụng các biến chưa được khởi tạo và trong chế độ phát hành, chúng tôi tắt tùy chọn để các biến thực sự chưa được khởi tạo. Như Sherwood Hu cho biết, một số trình biên dịch có thể tiêm mã để giúp phát hiện việc sử dụng các biến chưa được khởi tạo.
Chỉnh sửa: Trong mã ở trên tôi đang khởi tạo bộ đệm với giá trị 0, (không phải ký tự '0'), tương đương với khởi tạo nó bằng '\ 0'.
Để làm rõ thêm đoạn mã đầu tiên của tôi, hãy tưởng tượng ví dụ giả tạo sau đây.
char buffer[1024] = {0};
for (int i = 0; i < 1000000; ++i)
{
// Buffer is 0 initialized, so it is fine to call strlen
int len = strlen (buffer);
memset (buffer, 'a', 1024);
}
Lần đầu tiên thông qua các vòng đệm được khởi tạo 0, vì vậy strlen sẽ trở lại 0. Lần thứ hai thông qua các vòng đệm không còn khởi tạo 0, và trong thực tế không chứa một đơn 0 nhân vật, do đó, hành vi của strlen là không xác định.
Vì bạn đã đồng ý với tôi rằng nếu bộ đệm được khởi động, bộ đệm di chuyển bên trong vòng lặp không được khuyến khích và tôi đã cho thấy rằng việc khởi tạo bộ đệm ngoài vòng lặp không bảo vệ, tại sao khởi tạo nó?
Ví dụ của bạn không làm rỗng toàn bộ mảng, chỉ là phần tử đầu tiên ... –
Thực ra, nó * không * bỏ toàn bộ mảng. – paxdiablo
Ví dụ khởi tạo phần tử đầu tiên của mảng với một '\ 0' cụ thể và tất cả các phần tử khác có mặc định '\ 0'. Mã 'char a [4] = {'A'};' đặt 'A' trong một [0], '\ 0' trong [1] ... – pmg