반응형
일반 배열은 길이 정보가 없어서 인자로 넘기려면 길이 정보를 같이 넘겨야 하고, 인덱스를 조금만 벗어나도 Buffer Overflow 와 같은 문제가 발생하므로 안전하지 않다.
C++20 이후에는 모든 연속 객체(배열, 문자열, 벡터, ...)를 안전하게 참조할 수 있도록 해주는 std::span을 사용할 수 있다.
연속 객체를 std::span으로 참조하게 되면 순차 컨테이너에서 제공하는 함수를 사용할 수 있다. (길이 정보와 반복자를 가짐)
1. 사용법
#include <span>
std::span< var-type > var; // 동적 길이를 가지는 span
std::span< var-type, size > var; // 정적 길이를 가지는 span
(1) 인자
1-1) var-type : 변수나 객체의 타입을 지정
1-2) size : span 사이즈를 지정하여 정적 span으로 사용
2. 사용 예제
#include <iostream>
#include <string>
#include <span>
template <typename T>
void printContainer(const std::span<T>& param)
{
if (param.empty())
{
std::cout << "empty." << std::endl;
return;
}
std::cout << "value:";
for (const auto& v : param)
{
std::cout << " " << v;
}
std::cout << ", size: " << param.size() << std::endl;
}
int main()
{
int iArr[5]{1,2,3,4,5};
// 배열을 정적 span으로 설정
std::span<int, 5> spArr{iArr};
for (auto it = spArr.begin(); it != spArr.end(); ++it)
{
std::cout << *it << std::endl; // 1 2 3 4 5
}
// 배열을 동적 span으로 설정하여 인자로 사용
printContainer(std::span<int>{iArr}); // value: 1 2 3 4 5, size: 5
// 문자열을 동적 span으로 설정
std::string pStr{"abcdefg"};
std::span<char> spStr{pStr};
printContainer(spStr); // value: 1 2 3 4 5, size: 5
// 빈 span을 인자로 사용
printContainer(std::span<int>{}); // empty.
return 0;
}
반응형