본문 바로가기
C/[코드조선] C 핵심

[C] 버퍼, 버퍼링

by 묻공러 2024. 2. 13.

버퍼, 버퍼링
버퍼는 경계선을 넘어서 데이터를 주고 받을 때 데이터를 주고 받는 것 자체가

(여기서 경계선이란 컴퓨터와 인터넷의 사이를 의미한다)
로컬 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