2012-06-04 46 views

Trả lời

5

Cách nhanh nhất tôi biết giá trị -1 (hoặc 0) là memset:

int v[10]; 
memset(v, -1, 10 * sizeof(int)); 

Dù sao bạn có thể tối ưu hóa vòng lặp theo cách này:

int i; 
for(i = 10; i--;) 
    v[i] = -1; 
+1

Trên hai máy bổ sung. Sẽ không làm việc trên những thứ kỳ lạ như ký hiệu và độ lớn. Nhưng vì tất cả thế giới ngày nay là bổ sung của hai, vâng. –

1

memset rất nhanh.

int arr[10]; 
memset(arr, -1, sizeof(arr)); 

Tuy nhiên, những gì bạn có thể sẽ được chuyển thành lời gọi để ghi nhớ bởi trình biên dịch tối ưu. Nhìn vào đầu ra lắp ráp của bạn để đảm bảo, nhưng rất khó mà vòng lặp sẽ vẫn là một vòng lặp khi biên dịch.

2

Trong GNU C gì bạn có thể làm là:

int myArray[10] = {[0 ... 9] = -1}; 

Khởi tạo một loạt các yếu tố: http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

Và như không ai đề cập đến nó, trong di động C:

int myArray[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; 
+0

Cảm ơn, chỉ trong GNU C? – Nick

+0

@Nick Đây không phải là C mà là phần mở rộng của GNU thành C (được kích hoạt mặc định bằng gcc). – ouah

+2

Tốt nếu bạn không quan tâm đến mã của bạn đang được di chuyển. –

5

Nếu bạn muốn khởi tạo mảng tại thời điểm khai báo bằng 0, bạn có thể sử dụng: int a[10] = {0}; rất nhanh. Nhưng nếu bạn muốn khởi tạo với một số giá trị khác hoặc muốn khởi tạo lại mảng của mình bằng 0 tại một số điểm sau đó trong mã, hãy sử dụng: memset(a, -1, size_a); (hoặc memset(a, 0, size_a); tương ứng) hoặc vòng lặp. Theo ý kiến ​​của tôi, luôn thích memset() để lặp lại vì memset() thường được tối ưu hóa để đặt toàn bộ từ trong bộ nhớ thành giá trị khởi tạo được đặt làm đối số thay vì đặt từng byte riêng lẻ.

Đối với số liệu thống kê, trên 32-bit cài đặt Linux của tôi với bộ nhớ 4GB và 2.2GHz * 2 bộ vi xử lý, thời gian chạy của bốn loại mã khởi tạo mảng được đưa ra dưới đây:

1). 0,002s

#include <string.h> 

#define SIZE 1000000 

int a[SIZE]; 

int main(void) 
{ 
    return 0; 
} 

2). 0,00s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE] = {0}; 
    return 0; 
} 

3). 0,003s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE]; 
    memset(a, -1, SIZE); 
    return 0; 
} 

4). 0,01s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE]; 
    int i; 
    for(i = 0; i < SIZE; i++) 
     a[i] = -1; 
    return 0; 
} 
+0

Vòng lặp phân bổ đơn giản sẽ được tối ưu hóa thành một cuộc gọi đến 'memset' bởi bất kỳ trình biên dịch tối ưu hóa sane nào. –

+0

Có, với '-O2' hoặc với' -O3', gcc 4.5.2 tối ưu hóa vòng lặp cấp phát cho mã lệnh 'memset()'. –

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