Tại sao lại sử dụng int i trong vòng lặp mà lại không dùng char i để tiết kiệm bộ nhớ

Chào mọi người em hôm nay có một thắc mắc, đó là em thường thấy khi mn sử dụng vòng lặp for.
Mọi người đều sử dụng dạng như là
for ( int i = 0 ;i<n; i++ )
Em có thử đổi kiểu dữ liệu trong vòng lặp for về char để thử chạy chương trình. Ví dụ:

#include<stdio.h>
int main()
{
	int a[10];
	for(char i = 0 ;i<10;i++)
	{
		printf("\n Nhap phan tu thua %d: ",i);
		scanf("%d",&a[i]);
	}
	printf("\n Mang Ban Vua Nhap Vao La:");
	for(char i = 0 ; i < 10 ; i++)
	{
		printf("\n %d",a[i]);
	}
	return 0;
}

thì chương trình cho kết quả vẫn chính xác như kiểu int i = 0.
Em thấy tại sao mn lại hay sử dụng 1 biến đếm tận 4 Byte thay cho 1 Byte ạ. Dùng 1 Byte có thể tiết kiệm được bộ nhớ một chút. Mong các tiền bối và các bạn giải ngố giúp mình.

2 Likes

bạn đã thử với n = 200 chưa?
vì tiết kiệm 3 byte mà làm cho code khó hiểu hơn thì có đáng?

bạn đang in a[i] đơn thuần, vậy để in theo format kiểu “a[1] = 4” như này thì làm sao, cast từ char thành số tương ứng? liệu có tiết kiệm hơn?
bạn đang lấy mục đích sử dụng cá biệt trong ví dụ của bạn để lấy đó làm tiêu chuẩn để đưa ra đánh giá chung?

anyway, mục đích cuối cùng của lập trình là giải quyết vấn đề, bạn thấy dùng byte không thành vấn đề thì cứ dùng, miễn giải quyết được vấn đề của bạn là được

7 Likes

Thứ nhất là việc chương trình xử lý ở tầng thấp nó phức tạp hơn rất nhiều so với cái mình đang nhìn thấy ở một đoạn code bậc trung và cao.
Nên không có nghĩa là nhìn thấy 2 vòng for giống hệt nhau chỉ khác char i và int i thì thực tế mã sinh ra như nhau chỉ khác là lệch nhau 3 byte.

Thứ 2 là việc sử dụng char i thu hẹp khoảng giá trị của index đi rất nhiều lần làm tăng nguy cơ bug lên nhiều lần nếu thao tác với dải index lớn.
Trong khi việc tiết kiệm 3 byte nó không mang ý nghĩa gì cả bởi vì tài nguyên máy tính rất lớn.

Trong thực tế vẫn sử dụng char hoặc int (16 bit) trong vòng for với các nền tảng nhúng 8,16 bit khi tài nguyên ít.

9 Likes

Một lý do khác có thể là int nó 3 chữ gõ ngắn hơn nên tiết kiệm thời gian :rofl:

2 Likes

bạn thực sự rảnh khi dùng loop mà phải suy nghĩ nên chọn int hay char và nếu có thể thì dùng char chỉ để tiết kiệm tận 3 byte bộ nhớ

1 Like

Khá lắm em trai.
Ngày xưa khi mới học anh cũng mày mò thích suy nghĩ về những cái tối ưu như này,
đó là tiền đề tạo thói quen viết code tối ưu trong tương lai.
Tiếp tục cố gắng nhé.

Đối với trường hợp (int, char) này, thì dù cho áp dụng đúng cách, lợi ích của nó cũng quá nhỏ nhặt, không đáng để tâm tới.
Lập trình viên càng pro thì sẽ có những vấn đề càng hóc búa cần giải quyết, do đó họ sẽ tự cân đo đong đếm xem cái nào nên để tâm vào suy nghĩ để đem lại hiệu quả tốt, cái nào không nên quan tâm đến vì không đem lại lợi ích tương xứng.

Cứ giữ câu hỏi này thêm vài năm nữa, sau này khi đến đúng thời điểm em sẽ tự tìm được câu trả lời.

7 Likes

Vòng for đâu phải chỉ để dùng truy cập index cho mảng. khai bảo mảng 1 000 000 phân tử xem thế nào.

6 Likes

Mình sẽ cung cấp thêm chi tiết về phần này dưới quan điểm của một người làm về hệ thống nhúng và bị giới hạn về tài nguyên:

  • Khi viết vòng for, mình luôn luôn tự đặt câu hỏi cho bản thân là dùng int hay char. Không chỉ là việc tối ưu tích tiểu thành đại, mà còn là một thói quen lập trình, luôn suy xét tất cả các khía cạnh của chương trình để không bỏ sót chi tiết, không bỏ sót bug. Mình còn xem xét việc dùng unsigned hay signed nữa.
  • Ở đây việc chọn dùng int hay char không chỉ là trong ngữ cảnh hiện tại, mà phải dự trù cho tương lai nữa. Nghĩa là có khả năng vòng for này có “bị” tăng kích thước lớn hơn 128 hay 256 trong tương lai hay không? Giả sử khi thiết kế một hệ thống wireless sensor network, vì giới hạn về khả năng phần cứng (giả định), nên số lượng node trong network không thể nào vượt quá 20 nodes (đã trao đổi với system engineer và hardware engineer), thì mình sẽ mạnh dạn sử dụng unsigned char thay vì int.

Để cho mọi người ở lĩnh vực khác dễ hình dung, thì giới hạn tài nguyên của một số chip có thể như sau:

  • Bộ nhớ Flash: 128KB - 256KB
  • Bộ nhớ RAM: 8KB - 64KB
7 Likes

Em cảm ơn anh ạ. Em rất hay tò mò về những thứ kiểu này. Dẫu có thể với người khác nó k đáng quan tâm nhưng em thấy rất thích thú về mấy điều xem là nho nhỏ này.

1 Like

Em cảm ơn anh đã giải đáp thắc mắc ạ. Chúc anh ngày mới tốt lành ạ.

1 Like

Em cảm ơn anh đã giải đáp thắc mắc ạ. Chúc anh ngày mới tốt lành

1 Like

Cảm ơn mọi người đã giúp đỡ em ạ. Em cảm ơn

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