C++ 14부터 비트 마스크를 이진법으로 표현해도 가독성 있게 작성하는 방법이 등장했다.


C++ 11까지의 비트 마스크 표현

 

C++11까지는 비트 마스크를 표현하기 위하여 16진법을 사용하여 표현하는 것이 가장 가독성이 좋았다.

const unsigned int red_mask	= 0xFF0000;
const unsigned int green_mask	= 0x00FF00;
const unsigned int blue_mask	= 0x0000FF;

예시 코드처럼 16진수 두 자리를 통해 rgb 값을 표현해서 비트 마스크로 사용할 수 있겠다.


C++ 14부터 추가된 비트 마스크 표현

 

C++ 14부터는 숫자의 단위를 좀 더 명확하게 끊어주기 위한 기호가 추가되었다. 숫자 자리수를 끊어주기 위한 기호이기 때문에 비트 마스크 이외의 용도로도 활용성이 있다는 것을 알아두자!

const unsigned int blue_mask = 0b1111'1111;

이진법으로 blue에 대한 비트 마스크를 정의했는데, 이진수의 경우 4자리씩 끊어서 보는 게 가독성에 좋다. 키보드에서 : 키 오른쪽으로 한 칸 이동한 위치에 있는 '(홑 따옴표) 기호를 이용하면 숫자 사이 자리를 끊어서 표현할 수 있다. 우리가 보기엔 기호가 숫자 사이에 들어가 있어서 문제가 생길 것 같지만 컴파일러는 해당 기호를 삭제하고서 온전히 숫자만 읽는다. 우리가 엔터 및 띄어쓰기를 통한 가독성을 높이는 행위처럼 컴파일러 입장에서는 숫자 사이에 들어있을 때 아무것도 아닌 기호가 된다.

내가 아는 익숙한 for문과는 for문을 보았기에 이를 기록하려 한다...!


일반적인 for문

 

남들에게는 일반적인 게 아닐 수 있지만 내가 프로그래밍을 하면서 보았던 코드들에서 대부분 for문은 다음과 같은 형태로 구현되어 있었다.

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (int i = 0; i < 10; i++)
	{
		cout << arrayTest[i] << endl;
	}

	return 0;
}

정말 교과서에 나오는 정석적인 for문이다...! 이렇게 생긴 코드를 대부분의 C/C++ 개발자들이 제일 처음 본 반복문이라고 나는 생각한다.


auto 키워드를 활용한 for문

 

주말에 프로그래밍 공부를 조금씩 하다가 발견한 for문이다. 정말 너무 간결하고 nice해서 충격을 먹고 포스팅을 한다.

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (auto element : arrayTest)
	{
		cout << element << endl;
	}

	return 0;
}

for문 첫 줄이 엄청나게 간결해졌다...!! 기존의 for문과 한번 비교 분석을 해보자!

 

우선 첫 번째로 당연히 코드가 간결해지고 코드 작성 시간이 줄어들게 되었다. 이전 코드는 은근히 코드를 작성하면서 기호를 추가하는 경우 끊김이 생기곤 했는데 위처럼 작성하는 경우엔 콜론 하나만 있으니 금방 타이핑을 할 수가 있었다. 두 번째로는 주어진 배열의 길이를 자동으로 for문이 가지게 된다는 점이다. for문을 작성할 때 항상 고민이었던 점은 배열을 사용하는 경우 for문에 해당 배열의 끝 지점이 어디인지 반드시 알고 있어야 했고 이를 잘못 지키는 경우 코드가 제대로 동작하지 않았다. 그래서 항상 어떻게 배열의 길이를 전달해줄까 고민하곤 했는데 이제 이런 고민을 할 필요는 없어졌다.

 

당연히 장점만 있는 것은 아닐 것이다. 바로 직전의 코드처럼 작성한다면 element에 매번 배열의 값이 복사된다. 이는 성능 하락의 주범이 될 수도 있겠다. 언제나 복사는 덜할수록 좋은 것 같다. 그리고 아직 검증은 안 해봤지만 저러한 작성 방식도 openMP가 적용되는지 의문이다. 이건 내일 회사 가서 한번 적용해서 돌려봐야겠다.

 

참고로 복사를 막는 방법으로 구현한 것은 아래와 같다. 참조 연산자를 사용하면 매번 복사하지 않고 수행시킬 수 있게 된다!

#include <iostream>

using namespace std;

int main()
{
	int arrayTest[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (auto& element : arrayTest)
	{
		cout << element << endl;
	}

	return 0;
}

오랜만에 최신 문물을 접한 느낌으로 충격을 받았다. 기존과 성능 차이가 꽤 있을지는 모르겠지만 적어도 코드가 간결해질 수 있어서 너무 좋은 것 같다. 혹시나 추가 설명이 필요하다면 아래 글을 참고하자!

 

 

Range-based for loop (since C++11) - cppreference.com

Executes a for loop over a range. Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container. [edit] Syntax attr(optional) for ( init-statement(optional)range-declaration : range-exp

en.cppreference.com

 

+ Recent posts