Tôi có nên dạy học sinh của mình alloca? [đóng cửa]


18

Làm thế nào được sử dụng rộng rãi allocatrong thế giới thực? Tôi có nên dạy học sinh của mình sử dụng allocakhi nó có ý nghĩa? Hay tôi nên dạy họ không bao giờ sử dụng nó? Xuất phát từ nền CAI RAII, ý tưởng không phải gọi freethủ công nghe có vẻ hứa hẹn, đặc biệt là trong các chức năng có nhiều điểm thoát.



8
Tại sao không dạy họ C99 VLAs?

@cnicutar alloca () phụ thuộc vào triển khai nhưng ít nhất nhiều triển khai trả về NULL khi thất bại. C99 VLAs không có cách nào để chỉ ra thất bại.
Biến chứng xem sinh học

2
@sbi: Đối với SO đây là một câu hỏi mở không thực sự phù hợp với định dạng của những gì người đóng cửa nghĩ rằng các bài đăng SO nên có. Đó là quá chủ quan, không có câu trả lời rõ ràng, chỉ là ý kiến. Điều này là tốt nhưng không phải cho SO. Cũng lưu ý rằng vì tôn trọng đại diện của OP, không ai bỏ phiếu, chúng tôi chỉ đóng câu hỏi này là lạc đề.
Paul Sasik

1
@PascalCuoq Bạn không nên phân bổ nhiều với alloca / VLAs. Nếu không chắc chắn "rất nhiều" trong bối cảnh hiện tại, hãy sử dụng malloc.

Câu trả lời:


31

Nếu bạn đang tổ chức một khóa học về lập trình C nói chung, bạn không nên dạy họ một điều không theo tiêu chuẩn. Các lập trình viên mới bắt đầu không cần phải viết mã không chuẩn và / hoặc không di động vì họ được dạy theo cách đó, đã là một vấn đề lớn đối với ngành công nghiệp phần mềm trong suốt 20-30 năm qua. Chi phí cho việc không dạy họ tiêu chuẩn và không có gì ngoài tiêu chuẩn có khả năng là thiên văn.

Nếu bạn đang tổ chức một khóa học nâng cao hơn về thuật toán hoặc lập trình ứng dụng, có thể tốt để đề cập đến nó. Mặt khác, tôi đã lập trình mọi thứ, từ các ứng dụng nhúng cứng thời gian thực cho đến ứng dụng Windows trong 15 năm mà không bao giờ sử dụng chức năng đó.


Cách sử dụng duy nhất mà tôi đã thấy ở đó sẽ không được thực hiện theo cách khác là thực hiện phát hiện ngăn xếp ngăn xếp trên một số phiên bản Windows, trong đó lỗi không thể chỉ ra là còn đủ dung lượng - hoặc có thể nó chỉ bị ASM sởn gai ốc để gặp sự cố ; đã được một lúc kể từ khi tôi nhìn vào mã đó. Nó đã làm việc, nhưng là một chút kinh dị.
Donal Fellows

13

Tôi có thể thấy hai điều xảy ra:

  1. Các sinh viên hiểu tác động của alloca, đọc về sự khác biệt giữa stack và heap, và sử dụng allocacẩn thận. (không có khả năng)

  2. Các sinh viên nghĩ rằng "wow, điều này giống như mallockhông phải lo lắng về free", sử dụng nó quá mức, bị tràn ngăn xếp và không có ý tưởng gì.

Tôi nghĩ sẽ tốt hơn nhiều nếu bạn mô tả alloca, sau đó chạy mã này:

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

Nguồn: http://www.strchr.com/alloca

cho họ thấy những nguy hiểm, và sau đó bảo họ đừng sử dụng nó. Họ vẫn sẽ tìm hiểu về stack so với heap, xem các hành động nguy hiểm và có thể tiếp tục với các công cụ tiêu chuẩn.


1
Tôi nghĩ rằng hầu hết các sinh viên vẫn rơi vào loại thứ hai ngay cả sau khi cho họ xem mã ví dụ.
đúng

@WTP - Có thể, nhưng đó là lý do tại sao bạn bảo họ không sử dụng nó ngay cả sau khi cho họ thấy những gì có thể xảy ra.
BlackJack

4
Tại sao mã đó sử dụng _allocachứ không phải là alloca? Và tại sao nó đúc kết quả?
Keith Thompson

5

Câu trả lời cho câu hỏi này nên dựa trên mục tiêu của bạn là gì .

Bạn có muốn dạy một người đã biết cách lập trình cách viết C và làm việc với mã C hiện có không? Nếu vậy, hãy nói về alloca và bất cứ điều gì bạn muốn.

Mặt khác, nếu bạn đang dạy một khóa học giới thiệu chỉ sử dụng C bởi sự trùng hợp (và vì C là một ngôn ngữ rất nhỏ và v.v.), bạn nên tập trung vào các phần quan trọng (viết chương trình mô-đun, chương trình con, bộ sưu tập, .. .). Từ quan điểm của một sinh viên, alloca là một thứ dư thừa vì malloc là đủ trong hầu hết các trường hợp và từ góc độ mã tốt, tốt hơn hết bạn nên đề cập đến việc quản lý bộ nhớ thủ công gây khó chịu như thế nào và sau đó, có nhiều ngôn ngữ khác giải quyết vấn đề này mọi thứ đối với quản lý bộ nhớ sau đó là alloca hoặc RAII, vì vậy bạn thực sự không nên hạn chế những điều này và như bạn đã đề cập, việc hiểu mục đích của alloca sẽ dễ dàng hơn nhiều nếu bạn so sánh nó với các cách "chuẩn hơn" khác để làm mọi thứ trong các ngôn ngữ khác (hoặc C99 ...)


2

Không.

Lý do duy nhất mà một lập trình viên C thậm chí nên biết về sự tồn tại của alloca là để hiểu và sửa mã kế thừa sử dụng nó.

Bất kỳ việc sử dụng allocalà một trong hai

  1. Vô dụng, tức là nó có thể được thay thế một cách tầm thường bằng các biến có kích thước cố định trong thời gian lưu trữ tự động, HOẶC
  2. Một chồng tràn nguy hiểm đang chờ để xảy ra.

Ngoài một vài thí nghiệm suy nghĩ mà tôi chưa bao giờ tìm thấy bất kỳ ví dụ thực tế nào, không có trường hợp sử dụng nào cho alloca(hoặc VLA) mà không vô dụng hoặc dễ bị tổn thương (một trong 2 trường hợp trên).


2
Tất nhiên, hoàn toàn không ai có thể sử dụng nó một cách có trách nhiệm. Không bao giờ.
DeadMG

Việc sử dụng "có trách nhiệm" duy nhất alloclà 100% tương đương với các mảng tự động có kích thước cố định và ít di động hơn.
R ..

Tôi đoán, sau đó, không ai có thể muốn phân bổ một số lượng động, giả sử, một vài kilobyte sẽ không bao giờ tràn. Hoặc gọi một số chức năng API hệ điều hành sẽ cho họ biết số tiền khả dụng. Hoặc chỉ cần tăng kích thước ngăn xếp lên rất nhiều.
DeadMG

Nếu đó là một vài KB và bạn tự tin rằng bạn có một vài KB, bạn chỉ có thể sử dụng T foo[5000];hoặc bất cứ điều gì.
R ..

Chỉ khi T có một hàm tạo mặc định tầm thường. Nếu tôi là người cần hiệu năng, thậm chí việc xóa bộ nhớ đơn giản có thể khiến tôi phải trả giá. Nhưng các loại khác có thể có logic xây dựng mặc định phức tạp hơn nữa. Ví dụ, nếu tôi muốn tự động tạo một mảng std::mutex, tôi có thể gọi một lệnh gọi kernel và chuyển đổi ngữ cảnh cho năm nghìn mutexes. Không rẻ. Chưa kể chi phí bộ đệm bổ sung của việc đặt các biến cục bộ sau mảng.
DeadMG

1

Ý kiến ​​của tôi là không khuyến khích sử dụng nó trừ khi bạn đang dạy các nguyên tắc trình biên dịch cấp thấp được sử dụng để phân bổ không gian ngăn xếp cho các biến cục bộ. Dạy nó trong bối cảnh đó.


0

Các tài liệu GCC có một vài ưu thực tiễn và nhược điểm trên alloca(). Từ góc độ thực tế, một số lượng lớn phần mềm miễn phí sử dụng nó, vì vậy thật tốt khi hiểu cách thức hoạt động của nó và nơi nó được sử dụng trong mã hiện có.

Truyền -Wl,-stack=kích thước ngăn xếp mới cho gcc làm tăng kích thước ngăn xếp tối đa; bạn sẽ cần phải làm điều này nếu dự án của bạn sử dụng alloca()hoặc phân bổ các mảng tạm thời lớn hoặc sử dụng đệ quy qua một độ sâu phụ thuộc vào ngữ cảnh nhất định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.