카테고리 없음

스트링의 크기와 문자열의 null문자

시코. 2024. 2. 24. 22:28
728x90

https://www.inflearn.com/questions/91707/string%EC%9D%98-%ED%81%AC%EA%B8%B0

//no warning이건 순서가 cstdio 위에있어야 적용됨 코드는 위에서부터 실행된다
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>



int main()
{
	// string의 크기가 40바이트라는 내용을 알게 되었다 
    //https://www.inflearn.com/questions/91707/string%EC%9D%98-%ED%81%AC%EA%B8%B0
	// 내용을 살펴보니 여러 포인터와 공용체로 인한 크기였다
	// 
	//string의 경우 사이즈멤버 변수는 문자열 갯수와 동일하고 
    //널 문자는 제외하고 센다(문자열데이터에는 있긴 있다)
	// 
	//string 안의 bx라는 공용체에 짧은 문자열은 직접 버퍼에 넣고 
    //긴 문자열은 포인터에 넣어둔다
	// 공용체 https://learn.microsoft.com/ko-kr/cpp/cpp/unions?view=msvc-170
	// 
	// string에 문자열 리터럴 대입 초기화 시 
	//basic_string() noexcept(is_nothrow_default_constructible_v<_Alty>) : _Mypair(_Zero_then_variadic_args_t{}) {
	//	_Mypair._Myval2._Alloc_proxy(_GET_PROXY_ALLOCATOR(_Alty, _Getal()));
	//	_Tidy_init();
	//}
	// 라는 코드가 실행된다 신기하다.
	// 
	// 
	//문자열에는 무조건 뒤에 \0가 붙는다
	// 
	//
	// 살펴보던중 constexpr 라는 키워드를 발견했다 
    //const와 유사한 부분이 많다 https://modoocode.com/293
	// 
	// 그리고 템플릿코드라는걸 알게 되었다 https://modoocode.com/295 
    // 두렵다
	// 
	// 
	//
	const char* character = "hell";
    //문자열에 이미 널값이 있어 직접 char배열에 넣으려면
    //한자리 더 할당해 줘야 한다 string에서는 이런 부분은
    //편의상 직관적으로 하기 위해 size 와 capacity 의 비교에서 null을 제거한것 같다
	const char character_arr[5] = "hell";			
	const std::string string = "hell";
	const std::string string_numbers_for_size_check__is_including_null_const = 
    "012345678912345";
	//스트링 기본 용량 15 15자 넣고 사이즈가 15 되어도 용량 안늘어남  16되니까 늘어남
	std::string string_numbers_for_size_check__is_including_null = "123456789012345";				
	//30자리 스트링
	std::string string_numbers_for_size_check__30 = "12345678901234512345678901234567890";				

	//raw data 안의 bx 라는 공용체확인 해 봄
	std::string string_size_check_5 = "12345";							
	std::string string_size_check_14 = "12345678901234";				
	//스트링 기본 용량 15 15자 넣고 사이즈가 15 되어도 용량 안늘어남  16되니까 늘어남
	std::string string_size_check_15 = "123456789012345";
	std::string string_size_check_16 = "1234567890123456";
	char* character_cin = new char[10];
	char* character_scanf = new char[10];
	std::string string_cin;
	std::string string_scanf;
	std::cin >> character_cin;
	scanf("%s", character_scanf);
	std::cin >> string_cin;
	scanf("%s", string_scanf);
	std::cout <<
		"string size: "<< sizeof(std::string) << std::endl <<//40
		"string pt size: "<< sizeof(std::string*) << std::endl <<//8
		"string var size(const'hell'): "<< sizeof(string) << std::endl <<//40
		"string var size(cin input): "<< sizeof(string_cin) << std::endl <<//40
		"string var size(scnaf input): "<< sizeof(string_scanf) << std::endl <<//40
		"char size: "<< sizeof(char) << std::endl <<//1
		"char pointer size: "<< sizeof(char*) << std::endl <<//8
		"char pointer var size(const'hell'): "<< sizeof(character) << std::endl <<//8
		"char pointer var size(cin input): "<< sizeof(character_cin) << std::endl <<//8
		"char pointer var size(scanf input): "<< sizeof(character_scanf) << std::endl <<//8
		//40 값이 커지면 스트링도 커질 줄 알았는데 다른곳에 
        //값이 할당되고 포인터만 가지고 있는듯 하다
		"string check is need null for end?: " << 
        sizeof(string_numbers_for_size_check__is_including_null) << std::endl <<
		//30길이 스트링 값이 커져도 40바이트 고정이다
		"30 string: " << sizeof(string_numbers_for_size_check__30) << std::endl <<
		std::endl;
	
}
728x90