Câu hỏi này nhận được một sự tiếp nhận đóng băng tại SO, vì vậy tôi quyết định xóa nó ở đó và thử ở đây để thay thế. Nếu bạn nghĩ rằng nó cũng không phù hợp ở đây, ít nhất vui lòng để lại nhận xét về đề xuất cách tìm ví dụ tôi sau ...
Bạn có thể đưa ra một ví dụ , trong đó việc sử dụng C99 VLA mang lại lợi thế thực sự so với những thứ như cơ chế sử dụng C ++ RAII tiêu chuẩn hiện tại không?
Ví dụ tôi sau nên:
- Đạt được lợi thế hiệu suất dễ dàng đo được (10% có thể) so với sử dụng heap.
- Không có một cách giải quyết tốt, sẽ không cần toàn bộ mảng.
- Thực tế được hưởng lợi từ việc sử dụng kích thước động, thay vì kích thước tối đa cố định.
- Không thể gây ra tràn ngăn xếp trong kịch bản sử dụng bình thường.
- Đủ mạnh để cám dỗ nhà phát triển cần hiệu năng để đưa tệp nguồn C99 vào dự án C ++.
Thêm một số làm rõ về ngữ cảnh: Ý tôi là VLA có nghĩa là C99 và không được bao gồm trong C ++ tiêu chuẩn: int array[n]
đâu n
là một biến. Và tôi sau một ví dụ về trường hợp sử dụng trong đó nó bỏ qua các lựa chọn thay thế được cung cấp bởi các tiêu chuẩn khác (C90, C ++ 11):
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Một vài ý tưởng:
- Các hàm lấy varargs, tự nhiên giới hạn số lượng vật phẩm ở mức hợp lý, nhưng không có bất kỳ giới hạn trên mức API hữu ích nào.
- Hàm đệ quy, nơi ngăn xếp lãng phí là không mong muốn
- Nhiều phân bổ nhỏ và phát hành, trong đó chi phí heap sẽ là xấu.
- Xử lý các mảng đa chiều (như ma trận có kích thước tùy ý), trong đó hiệu suất là rất quan trọng và các chức năng nhỏ dự kiến sẽ được đưa vào rất nhiều.
- Từ nhận xét: thuật toán đồng thời, trong đó phân bổ heap có phí đồng bộ hóa .
Wikipedia có một ví dụ không đáp ứng các tiêu chí của tôi , bởi vì sự khác biệt thực tế đối với việc sử dụng heap dường như không liên quan ít nhất là không có ngữ cảnh. Nó cũng không lý tưởng, vì nếu không có nhiều ngữ cảnh hơn, có vẻ như số lượng vật phẩm rất có thể gây ra tràn ngăn xếp.
Lưu ý: Tôi đặc biệt theo mã ví dụ hoặc đề xuất thuật toán sẽ có lợi cho việc này, để tôi tự thực hiện ví dụ.
alloca
, mà tôi nghĩ về cơ bản là giống nhau). Nhưng điều đa luồng đó là tốt, chỉnh sửa câu hỏi để bao gồm nó!
malloc
hành vi của Linux có phù hợp với tiêu chuẩn C hay không.
alloca()
sẽ thực sự tồnmalloc()
tại lâu hơn trong một môi trường đa luồng vì sự tranh chấp khóa sau này . Nhưng đây là một sự kéo dài thực sự vì các mảng nhỏ chỉ nên sử dụng một kích thước cố định và các mảng lớn có thể sẽ cần cả đống.