2011-12-03 33 views
7

Trên Linux, sử dụng C, giả sử tôi đã xác định động n đặt tên số phần tử tôi phải lưu trữ trong một mảng (int my_array[n]) chỉ trong một khoảng thời gian ngắn, một hàm gọi, theo đó hàm được gọi chỉ sử dụng ít bộ nhớ (vài trăm byte).Kích thước ngăn xếp còn lại cho đến khi tràn ngăn xếp xảy ra

Chủ yếu là n là ít, một phần mười. Nhưng đôi khi n có thể lớn, nhiều như 1000 hoặc 1'000'000.

Làm cách nào để tính toán, liệu ngăn xếp của tôi có thể giữ n*o + p byte mà không bị tràn không?

Về cơ bản: Còn bao nhiêu byte trên ngăn xếp của tôi?

+0

có thể trùng lặp với [Kiểm tra kích thước ngăn xếp có sẵn trong C] (http://stackoverflow.com/questions/53827/checking-available-stack-size-in -c) –

+0

@BrendanLong, tôi thấy câu hỏi đó, nhưng khi nó nói "Tôi đang sử dụng MinGW với GCC 3.4.5 (mingw-đặc biệt vista r3)", câu trả lời có phần Windows tập trung. Câu hỏi của tôi là Linux/* nix tập trung. ;-) – kay

+0

tại sao bạn không thể sử dụng 'getrusage()' và 'getrlimit()'? – sverre

Trả lời

4

Thật vậy, câu hỏi checking available stack mang lại câu trả lời hay.

Nhưng câu trả lời thực tế hơn là: không phân bổ dữ liệu lớn trên ngăn xếp cuộc gọi.

Trong trường hợp của bạn, bạn có thể xử lý khác nhau trường hợp khi n<100 (và sau đó phân bổ trên stack, có lẽ qua alloca, làm cho tinh thần) và trường hợp khi n>=100 (sau đó, phân bổ trên heap với malloc (hoặc calloc) và đừng quên free nó). Thực hiện ngưỡng 100 một hằng số #define -d.

Một khung cuộc gọi điển hình trên call stack nên, trên máy tính xách tay hoặc máy tính để bàn hiện tại, một vài kilobyte nhiều nhất (và tốt nhất là ít hơn nếu bạn có đệ quy hoặc chủ đề). Tổng không gian ngăn xếp thường là nhiều nhất một vài megabyte (và đôi khi ít hơn nhiều: bên trong hạt nhân, ngăn xếp thường là 4Kbytes mỗi!).

+1

Trộn 'calloc' và' alloca' là tin xấu, bởi vì một cái khởi tạo dữ liệu và cái kia thì không. Điều này có khả năng có thể gây ra lỗi lạ. – Dave

+2

Ok, nó có thể là 'malloc' &' alloca'. –

4

Nếu bạn không sử dụng đề, hoặc nếu bạn biết rằng mã của bạn thực hiện trên stack chính, sau đó

  1. Ghi hiện con trỏ ngăn xếp khi nhập chính
  2. Trong thói quen của bạn, có được chồng giới hạn hiện tại (thấy man getrlimit)
  3. Hãy so sánh sự khác biệt giữa con trỏ ngăn xếp hiện tại và một trong những ghi nhận ở bước 1 với giới hạn từ bước 2.

Nếu bạn đang sử dụng threa ds và có thể thực thi trên một chủ đề không phải là chính, xem man pthread_getattr_np

Các vấn đề liên quan