Thảo luận về static variables và register variables

Mình có đọc 2 phần này trong quyển the C programming nhưng hơi khó hiểu quá. Nhờ mọi giải thích về bản chất hai nội dung này với.

2 Likes

e học PHP có học qua static nhưng cũng chưa hiểu lắm. cũng mong đc hướng dẫn thêm ạ

1 Like

Static variable cũng như automatic variable là chỉ hoạt động trong 1 function nào đó thôi, nhưng khác ở điểm là auto variable khi thoát ra function thì hoàn toan bị xóa = > mất giá trị của variable, khai báo static thì khi bạn gọi function đó 1 lần nữa thì giá trị i ở lần gọi trước vẫn giữ nguyên, Trong trường hơp này nếu dùng auto variable thì giá trị sẽ trở lại là như ban đầu. Có cái ví dụ cho dễ hình dung :slight_smile:

#include <stdio.h>
int times_called(void);
main()
{
int i;
for (i = 0; i < 10; i++)
   printf("times_called() has been called %d times\n",
        times_called());
}

int times_called(void)
{
/* The variable is declared and defined once.
 * Subsequent uses of the function will skip the declaration line. */
static int i = 0;
++i; /* Incrementing the variable */
return i;
}

Nếu mà ko dùng static ở biến i mà khai báo bình thường ở hàm time_called mỗi lần thoát ra để tăng i trong vòng lập thì biến i trong time_called sẽ reset giá trị lại về 0 :wink:

Còn register variable rất hiếm gặp, nó cho phép khai báo variable đặt ở trên register( thanh ghi) của CPU, tác dụng làm gì thì mình ko biết :smile:

8 Likes

ok,cảm ơn bạn về bài viết.

1 Like

Câu này Đạt đính chính lại một chút. Static là một từ khóa dễ gây hiểu nhầm trong C và C++. Ở đây ta chỉ nên bàn về C. Thì static có 2 cách dùng. @mrmike612 đã nói cách thứ nhất là khai báo trong 1 function.

Cách dùng thứ 2 là khai báo ở ngoài 1 function. Khi đó biến này thuộc về file scope tức là chỉ tồn tại trong file đó thôi, không đem ra sử dụng file khác được, nếu bạn cố sử dụng extern thì compiler sẽ báo lỗi. Giá trị cũng không bị mất đi giống như khai báo trong một function.

Việc sử dụng register là nhằm gợi ý cho compiler rằng biến này có tần xuất sử dụng rất cao, hãy sử dụng register(thanh ghi) để thao tác biến này. Tuy nhiên gợi ý này hoàn toàn có thể bị bỏ qua bởi compiler.

Mục đích là tốc độ vì thao tác trên biến register sẽ nhanh hơn.

9 Likes

Extern là lệnh gì vậy anh Đạt.

extern là lệnh để mở rộng phạm vi của một biến để có thể sử dụng biến X được khai báo ở file khác.
Ví dụ ở dưới là cách sử dụng extern để mở rộng phạm vi của bien_global sang file khác.

File A.c định nghĩa (define) bien_global

int bien_global;

File A.h khai báo (declare) bien_global

extern int bien_global;

File B.c muốn sử dụng bien_global thì chỉ cần

#include "A.h"

void foo()
{
    bien_global = 2;
}
5 Likes

Hình như theo mình hiểu đây chỉ là biểu hiện của từ khóa static nó có tác dụng là như thế, có ai biết giải thích cho mình về bản chất tại sao static lại có thể làm được như thế không ? mình cảm ơn :slight_smile:

@dinhtan trả lời cho câu hỏi nào thế? Nếu muốn trả lời cho 1 comment nào đấy thì bấm vào nút reply ở dưới comment đấy, còn nếu muốn “quote” lại thì bôi đen rồi bấm quote reply

Thực ra nó làm được như thế vì bản chất của nó là như thế. Nếu mình hiểu như thế thì mình đã hiểu tại sao nó làm như thế đấy.

:trollface:

3 Likes

Vậy cho em hỏi cái biến bien_global ở file A.c kia làm sao để khi khai báo extern int bien_global; ở file B.c thì biết chính xác nó là biến ở file A.c ? Hay ở file B.c phải đặt tên biến giống y ở file A.c ?

Chỉ có đặt tên giống y chang thôi :slight_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?