버퍼, 버퍼링
버퍼는 경계선을 넘어서 데이터를 주고 받을 때 데이터를 주고 받는 것 자체가
(여기서 경계선이란 컴퓨터와 인터넷의 사이를 의미한다)
로컬 PC에서 주고 받는 것과 비교했을 때 현저하게 느리다
따라서 한 번 보낼 때 한꺼번에 최대한 많이 보내는 것이,
한 번 받을 때도 한꺼번에 최대한 많이 받는것이 효율적이다
즉, 버퍼 개념을 통해 쌓아두었다가 보낼 수 있을 때 최대한 많이 보내는 것이다
이를 무선 공유기에서는 버퍼의 크기를 직접 설정할 수도 있다
#include <stdio.h>
#include <string.h>
#define BUFFER_LENGTH (32)
static size_t s_buffer_index = 0u;
static char s_buffer[BUFFER_LENGTH];
void buffered_print(const char* str);
int main(void)
{
buffered_print("Hello, ");
buffered_print("world! ");
buffered_print("C is awesome! ");
buffered_print("Java is awesome too! ");
buffered_print("is C++ better? ");
return 0;
}
#define BUFFER_LENGTH (32)
static size_t s_buffer_index = 0u;
static char s_buffer[BUFFER_LENGTH];
void buffered_print(const char* str)
{
size_t num_left;
const char* temp_ptr = str;
num_left = strlen(str);
while (num_left > 0)
{
/* copy_count: 이번 반복에서 출력할 갯수 */
size_t copy_count = BUFFER_LENGTH - s_buffer_index - 1;
/* buffer_empty: 버퍼가 비었는지 안비었는지 */
const int buffer_empty = s_buffer_index == 0;
if (num_left < copy_count)
{
/* 남은 글자가 이번에 출력할 갯수보다 작으면 그냥 대입. */
/* 아니면 그냥 최대한 출력. */
copy_count = num_left;
}
/* 방금 계산한 갯수만큼 조정 */
s_buffer_index += copy_count;
num_left -= copy_count;
if (buffer_empty)
{
/* 버퍼가 비어 있다면 그대로 복사 */
strncpy(s_buffer, temp_ptr, copy_count);
s_buffer[s_buffer_index] = '\0';
}
else
{
/* 버퍼에 뭔가 있다면 이어붙이기 */
strncat(s_buffer, temp_ptr, copy_count);
}
temp_ptr += copy_count;
if (s_buffer_index == BUFFER_LENGTH - 1)
{
/* 꽉 차면 출력하고 비우기 */
printf("%s\n", s_buffer);
s_buffer_index = 0u;
}
}
return;
}
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] 비트필드와 비트플래그 (0) | 2024.02.14 |
---|---|
[C] 바이트 정렬 (0) | 2024.02.13 |
[C] 구조체 복사 (0) | 2024.02.12 |
[C] typedef (0) | 2024.02.12 |
[C] 동적 할당 (0) | 2024.02.11 |