char
wchar_t
char16_t
char32_t

char : 기본 문자 타입, 대개 8비트
wchar_t : 유니코드 같은 대규모 문자 집합의 문자를 보관하기 위해 제공된다
char16_t : UTF-16같은 16비트 문자 집합을 보관하기 위한 타입
char32_t : UTF-32 같은 32비트 문자 집합을 보관하기 위한 타입 

 

'프로그래밍언어 > C++' 카테고리의 다른 글

<c++ 11>이동연산, 복사 연산  (0) 2021.06.28
char*->int  (0) 2021.03.06
<c++>레지스터 변수  (0) 2020.10.15
<c++>decltype  (0) 2020.10.14
오버로딩  (0) 2020.10.04

이동 연산

좌변 값을 우변 값과 분리해서 처리하자는 것입니다.

 

복사대입과 복사 생성좌는 좌변값을 받으들이는 반면, 이동 대입과 이동 생성자는 우변값을 받아 들입니다. 

 

class Move 
{

public :
	int data=-1;
public :
	Move()
	{
		
		cout << "생성자"<<endl;
	};
	~Move() 
	{
		cout << "소멸자" << endl;
	};
	Move(Move&& d) 
	{
		cout << "이동 생성자" << endl;
	}; 
	Move(Move& d) 
	{
	
		cout << "복사 생성자" << endl;
	};
	Move& operator=(Move &&other)
	{
		if (this == &other)
			return *this;
		
		data = other.data;
		cout << "rvalue" << endl;
	
		return *this;
	}
	
};


int main()
{
	Move *mv1= new Move();
	cout << mv1<<endl;
	mv1->data = 10;
	Move *mv2=new Move(*mv1);
	cout << mv2 << endl;
	
	Move *mv3=new Move(std::move(*mv1));
	cout << mv3 << endl;

	mv3->operator=(std::move(*mv1));
	
	delete mv1;
	delete mv2;
	delete mv3;

	
	return 0;
}

차이점 

이동 연산은 복사 연산에 비해 상당히 간단하고 좀더 효율적인 편입니다. 

최적화로써 좋습니다. 

특히 이동 연산자는 예외던지기를 하지 않습니다. 

 

복사가 아닌 이동 연산을 사용해야 할떄는 언제 일까요?

반환값과 같은 몇가지 경우에는 언어 규칙에 정해져 있습니다.

하지만 일반적으로 우변값 참조자를 통해 컴파일러에게 알려줘야 합니다. 

std::move()는 우변값 참조자 를 반화하는 표준 라이브러리 함수입니다.

 

표준 라이브러리 컨테이너는 이동연산을 갖고 있으며 pair(), unique_ptr,같은 표준 라이브러리 타입도 마찬가지입니다. 

insert나 push_back같이 새로운 원소를 표준 라이브러리 컨테이너에 삽입하는 연산들은 역시 우변값을 받아들이는 버전을 가지고 있습니다. 

 

결과로는 복사보다 이동이 더 우수한 수준의 성능을 보여줍니다. 

'프로그래밍언어 > C++' 카테고리의 다른 글

c++11 char  (0) 2021.07.13
char*->int  (0) 2021.03.06
<c++>레지스터 변수  (0) 2020.10.15
<c++>decltype  (0) 2020.10.14
오버로딩  (0) 2020.10.04
int atoi(char*str1) {
	int count = 0;
	int answered=0;
	while (1) {
		if (*(str1 + count) == '\0') {
			break;
		}
		int answer;
		answer = (*(str1 + count)) - 48;
		count++;
		answered = answered *10+answer;
	}

	return answered;
}
int main() {

	char *str1 = (char *)"1234567890";
	int answer=atoi(str1);
	cout << answer;
	return 0;
}

 

'프로그래밍언어 > C++' 카테고리의 다른 글

c++11 char  (0) 2021.07.13
<c++ 11>이동연산, 복사 연산  (0) 2021.06.28
<c++>레지스터 변수  (0) 2020.10.15
<c++>decltype  (0) 2020.10.14
오버로딩  (0) 2020.10.04

본래  C는 register 키워드를 제공함으로써 컴파일러 Cpu 레지스터를 사용해서 자동 변수를 저장할것을 제안한다.

register int count_fast;

변수에 더욱 빨리 접근하는 것을 허용 하기 위함이다. 

 

*register 키워드가 오로지 자동 변수들과 함께 쓰인다고 가정할떄, register 키워드를 사용해야하는 단하나의 이유를꼽는다면 아마도 사용자가 외부 변수와 동일한 이름을 지닌 어떤 자동 변수를 사용하길 간절히 원한다는것을 의미한다.

이것이 auto를 사용하는 본래 목적이지만 register 키워드를 유지하는 가장 주용한 목적은 이키워드를 사용하는 기존 코드가 인식이 불가능해지는것을 방지하기 위함이다.

'프로그래밍언어 > C++' 카테고리의 다른 글

<c++ 11>이동연산, 복사 연산  (0) 2021.06.28
char*->int  (0) 2021.03.06
<c++>decltype  (0) 2020.10.14
오버로딩  (0) 2020.10.04
c++ array 탬플릿  (0) 2020.09.09

decltype 형식 지정자는 지정 된 식의 형식을 생성 합니다. decltype 형식 지정자는 auto 키워드와 함께 주로 템플릿 라이브러리를 작성 하는 개발자에 게 유용 합니다. auto  decltype 를 사용 하 여 반환 형식이 해당 템플릿 인수의 형식에 종속 되는 템플릿 함수를 선언 합니다. 또는 및를 auto 사용 decltype 하 여 다른 함수에 대 한 호출을 래핑하는 템플릿 함수를 선언한 다음 래핑된 함수의 반환 형식을 반환 합니다. 

출처:Microsoft

 

decltype(식)

ex)

int var;
const int&& fx();
struct A { double x; }
const A* a = new A();

네 가지 문에 의해 반환 되는 형식을 검사 decltype 합니다.

decltype(fx());

대 한 rvalue 참조 const int 입니다.

 

decltype(var);

var 변수의 형식입니다.

decltype(a->x);

멤버 액세스의 형식입니다.

decltype((a->x));

내부 괄호를 사용하면 문이 멤버 액세스가 아니라 식으로 평가됩니다. a가 포인터로 선언 되었으므로 const 형식은에 대 한 참조입니다 const double .

 

docs.microsoft.com/ko-kr/cpp/cpp/decltype-cpp?view=vs-2019

 

decltype(C++)

decltype(C++)decltype (C++) 이 문서의 내용 --> decltype 형식 지정자는 지정 된 식의 형식을 생성 합니다.The decltype type specifier yields the type of a specified expression. decltype 형식 지정자는 auto 키워드와 함께 주�

docs.microsoft.com

 

'프로그래밍언어 > C++' 카테고리의 다른 글

char*->int  (0) 2021.03.06
<c++>레지스터 변수  (0) 2020.10.15
오버로딩  (0) 2020.10.04
c++ array 탬플릿  (0) 2020.09.09
자동공간, 정적 공간 , 동적 공간(힙)(automatic ,static ,dynamic )  (0) 2020.09.08

객체언어의 특징중 하나인 다형성

함수의 다형성으로서 같은 이름의 함수가 디폴트 매개변수의 개수나 아니면 자료형이 다르다면

같은 이름의 함수를 사용하지만 다른 기능으로 이용할수 있다.

 

오버로딩의 사용하는 이유?

사실 이부분은 필자도 프로그래밍 처음 배울때 정말 궁금했던 부분이다. 

항상 이걸 왜써야하지 굳이 안써도 되는데 사실 이말도 틀린건 아니다.

하지만 우리는 프로그래밍을 하는 사람이라면 남들이 보았을때 여러 이름의 함수가 있는것보다

하나의 이름의 함수가 같은 기능의 함수들이 존재하는게  훨씬 편할것이다.

 

예를들어 Print() 함수가 있다고 가정해보자. 

Print함수는 외부에 데이터 값을 출력해주는 함수라고 가정해보자 

그러면 우리가 int형 ,string 형, char형... 등등 여러가지의 형태의 자료형이 존재한다.

여러 이름의 함수를 사용하면 PrintInt(), PrintString(),.... 이런식으로 계속해서 쓰이면 

얼마나 귀찮은가 그리고 어차피 출력문인데 같은 함수로 전부 통일하면 훨씬 편하지 않겠는가

그러면 Print 이 함수 하나로 모든 자료형을 출력이 가능해진다. 

이건 하나의 예시고 오버로딩은 프로그래밍을 하면할수록 정말 엄청나게 편리한 기능이라는거다. 

굳이 왜써야지가 아니라 오 이런 기능도 잇구나 하고 긍정적으로 받아들이는게

배우는 입장에선 엄청 좋은것같다. 어디까지나 필자의 생각이다. 

 

 

ex)

int Position(int x,int y);

int Position(int sum);

이 두함수는 같지만 매개변수(파라미터, 어규먼트)가 달라서 서로 다른 기능으로 사용할수 있다.

 

int Position(int x,int y){

   return x*y;

}

 

int Position(int sum){

   return sum+sum;

}

 

이런식으로 사용가능하다 .

하지만 주의점이 존재한다 .

 

ex)

double cube(double x);

double cube(double &x);

 

위의 함수를 보면 오버로딩 될것 같지만 될수가 없다

왜냐하면 

cube(x);

라고 가정해보자 

 

그러면 x가 double x 인지 double &x 전부 일치 해버린다.

그러면 이러한 모호한 관계가 되버려서 위의 두개의 함수중 어떠걸 사용하는지 알수가 없어진다.

 

그래서 어떤 자료형에 대한 참조와 자료형 자체를 같은것으로 간주한다. 

 

또하나 기능중 const에 따라 오버로딩이 구분된다. 

1.void dribble(char* bits);//오버로딩 된다

2.void dribble(const char*cbits);//오버로딩 된다

 

즉 처음에 선언해주는 데이터가 const를 가지고 선언된다면 

2번 함수를 사용하며 const가 없으면 1번함수를 참고합니다.

 

만약 void davl(char* bits); 함수가 존재시 

davl(const 매개변수(파라미터,어규먼트) );를 사용하면 

davl함수는 const 매개변수를 가진  대응하는 함수가 존재 하지 않습니다. 

void davl(char* bits); 함수를 이용하지 못합니다.

 

 

'프로그래밍언어 > C++' 카테고리의 다른 글

<c++>레지스터 변수  (0) 2020.10.15
<c++>decltype  (0) 2020.10.14
c++ array 탬플릿  (0) 2020.09.09
자동공간, 정적 공간 , 동적 공간(힙)(automatic ,static ,dynamic )  (0) 2020.09.08
strcpy, strcnpy 차이  (0) 2020.09.08

사용 예시

#include<array>
...
using namespace std;
array<int,5> ai;
array<double, 4> ad={1.2,2.1,3.1,4.1};

'프로그래밍언어 > C++' 카테고리의 다른 글

<c++>decltype  (0) 2020.10.14
오버로딩  (0) 2020.10.04
자동공간, 정적 공간 , 동적 공간(힙)(automatic ,static ,dynamic )  (0) 2020.09.08
strcpy, strcnpy 차이  (0) 2020.09.08
문자열 복사와 대입  (0) 2020.09.08

 

 

자동 공간(stack)

자동 공간을 사용하는 함수 안에서 정의되는 보통의 변수들을 자동 변수 라고 한다.

-자동 변수들이 자신이 정의되어 있는 함수가 호출되는 수간에 자동으로 생겨나 

 함수 종료까지만 존재합니다. 

-자동 변수는 스택에 저장된다.

-후입 선출 또는 LIFO

-스택은 프로그램이 실행하는 동안 늘었다 줄었다를 반복한다.

ex)

void func(){

int a=40; // 자동 공간 저장 

char ch ='d';  // 자동 공간 저장 

}

 

정적 공간 (static)

-정적 공간은 프로그램이 실행되는 동안에 지속적으로 존재하는 공간이다.

-K&R C에서는 정적 배열과 정적 구조체만 초기화 가능. 그러나,

C++ Release 2.0(이후) ANSI C 에서는 자동 배열과 자동 구조체를 초기화 하는것을 허용

-정적 변수는 프로그램이 실행되는 동안에 지속적으로 존재

-자동 변수는 특정 함수나 블록이 실행 되는 동안에만 존재

ex) static double fee =56.50;

 

동적 공간 (heap)

-동적 공간은 자유 공간 또는 힙(heap)이라고 부른다.

-new 와 delete 연산자는 보다 융통성 있는 방법으로 제공 

-자유공간(free store), 메모리 풀(memory pool)을 관리 

-데이터의 수명은 프로그램의 수명이나 함수의 수명에 얽매이지 않음

-new 와 delete를 함께 사용하면 일반 변수를 사용할때 보다 메모리에 대해 더 강력한 

제어권을 가짐 

ex)int a =new int ;

 

 

*메모리 관리는 점점 더 복잡해짐에 따라 스택의 경우, 자동적으로 늘어나고 줄어드는

매커니즘으로 인해 값들이 메모리상에서 인접하여 존재하게 된다. 

그러나  new와 delete의 상호 작용으로 여유 공간을 확보 할수 있고, 더 복잡한 메모리 대입 

요청을 처리할수 있다.

 

 

 

'프로그래밍언어 > C++' 카테고리의 다른 글

오버로딩  (0) 2020.10.04
c++ array 탬플릿  (0) 2020.09.09
strcpy, strcnpy 차이  (0) 2020.09.08
문자열 복사와 대입  (0) 2020.09.08
enum의 주의점  (0) 2020.09.02

+ Recent posts