주요 콘텐츠

coder.nullcopy

생성 코드에서 초기화되지 않은 변수 선언하기

설명

coder.nullcopy를 사용하면 변수 값을 복사하지 않고 초기화되지 않은 변수를 선언하여 생성 코드를 최적화할 수 있습니다. 다음의 특정한 두 가지 상황에서만 coder.nullcopy를 사용하십시오.

  • 코드 생성 시 다음 오류 중 하나가 표시됩니다.

    코드를 생성하려면 모든 변수를 사용 전에 완전히 정의해야 합니다.(For code generation, all variables must be fully defined before use.)

    코드를 생성하려면 모든 셀형 배열 요소를 사용 전에 완전히 정의해야 합니다.(For code generation, all cell array elements must be fully defined before use.)

    하지만 모든 변수와 셀형 배열 요소가 모든 실행 경로에서 완전히 정의되었으며, 다른 문제 해결 방법들은 검토 후 기각되었습니다. 문제 해결: 변수를 사용하기 전에 완전히 정의해야 합니다 (MATLAB Coder) 항목과 Resolve Issue: Cell Array Elements Must Be Fully Defined Before Use 항목을 참조하십시오.

  • 생성 코드에서 중복된 변수 할당이 있습니다. 즉, 변수에 값이 할당된 후 이 변수가 사용되기 전에 다른 값이 할당되었습니다.

주의하여 coder.nullcopy를 사용하십시오. 대부분의 경우 MATLAB® 코드에 coder.nullcopy 함수를 포함하지 않은 경우에도 코드 생성기는 coder.nullcopy에 해당하는 최적화를 자동으로 수행합니다. coder.nullcopy를 사용하여 변수를 선언하고 해당 변수를 사용하기 전에 완전히 할당하지 않으면 생성 코드의 동작이 예측 불가능해질 수 있습니다.

X = coder.nullcopy(A)A의 유형, 크기, 실수/복소수 여부만 X에 복사하고 요소 값은 복사하지 않습니다. 생성 코드에서 coder.nullcopy는 초기화되지 않은 변수를 선언하여 메모리 초기화 오버헤드를 발생시키지 않으면서 X에 대한 메모리를 사전할당합니다. MATLAB 실행에서 coder.nullcopy는 입력값을 반환합니다.

대부분의 경우 coder.nullcopy는 재귀적으로 적용됩니다. 즉, A가 집합체 유형(클래스, 구조체 또는 셀형 배열)인 경우 coder.nullcopyA의 필드, 속성 또는 요소에 대한 메모리도 사전할당합니다. 그러나 A가 하나 이상의 가변 크기 배열을 포함하는 집합체 유형인 경우에는 특별한 고려 사항이 적용됩니다. 클래스, 구조체 또는 셀형 배열 내에서 가변 크기 배열 선언하기 항목을 참조하십시오.

X를 사용하거나 반환하기 전에 모든 요소에 값을 할당해야 합니다. 그러지 않으면 생성 코드의 동작이 예측 불가능해질 수 있습니다.

예제

예제

모두 축소

이 예제에서는 배열의 각 요소에 값을 할당하는 오버헤드 없이 생성 코드에서 배열을 선언하는 방법을 보여줍니다.

n×n 행렬을 반환하는 MATLAB 함수 foo를 생성합니다. 배열의 각 요소에 값 1을 할당하여 출력 행렬 변수 out을 초기화합니다. 그런 다음 for 루프를 사용하여 out의 각 요소에 값을 재할당합니다.

function out = foo(inp) %#codegen
out = ones(inp);
for idx = 1:inp*inp
   if mod(idx,2) == 0
      out(idx) = idx;
   else
      out(idx) = idx + 1;
   end
end

이 함수에 대한 C 코드를 생성하고 생성된 코드를 검토합니다. C 코드는 for 루프(C 코드 매핑의 라인 33 ~ 35)에서 out의 각 요소에 값 1.0을 명시적으로 할당합니다. 그런 다음 생성 코드는 두 번째 for 루프(라인 37 ~ 43)에서 out의 요소에 값을 재할당합니다.

Code mapping between MATLAB code and generated C code without using coder.nullcopy

for 루프를 사용하여 각 요소에 값을 할당하기 전에 foo를 수정하고 coder.nullcopy를 사용하여 out을 double형으로 구성된 n×n 행렬로 선언합니다.

function out = foo(inp) %#codegen
out = coder.nullcopy(ones(inp));
for idx = 1:inp*inp
   if mod(idx,2) == 0
      out(idx) = idx;
   else
      out(idx) = idx + 1;
   end
end

이 함수에 대한 C 코드를 생성하고 이 생성 코드를 coder.nullcopy를 사용하지 않고 생성된 코드와 비교합니다. coder.nullcopy를 사용할 때, 생성 코드는 out의 요소에 값을 한 번만 할당합니다.

Code mapping between MATLAB code and generated C code when using coder.nullcopy

하나 이상의 가변 크기 배열을 포함하는 집합체 유형(클래스, 구조체 또는 셀형 배열)에서 coder.nullcopy를 호출하는 경우 for 루프를 사용하여 값을 할당하기 전에 가변 크기 배열에서도 coder.nullcopy를 직접 호출해야 합니다. 이 추가 단계는 벡터화된 할당을 수행하거나 필드, 속성 또는 셀형 배열 요소가 고정 크기인 경우에는 필요하지 않습니다.

예를 들어, 함수 copyStructExample을 살펴보겠습니다. 이 함수는 세 개의 필드가 있고 그 중 두 필드는 가변 크기인 구조체를 반환합니다. coder.nullcopy를 사용하여 이 구조체를 선언한 다음 각 필드에 값을 할당합니다.

  • for 루프를 사용하여 고정 크기 out.field1에 값을 할당합니다.

  • 벡터화를 사용하여 가변 크기 out.field2에 값을 할당합니다.

  • 가변 크기 s.field3에서 coder.nullcopy를 직접 호출한 다음 for 루프를 사용하여 out.field3에 값을 할당합니다.

function out = copyStructExample(n) %#codegen

s.field1 = ones(1,5);
s.field2 = ones(1,n);
s.field3 = ones(1,n);
out = coder.nullcopy(s); % out is a structure with unassigned contents

for i = 1:5
    out.field1(i) = i+2;
end

out.field2 = 5:5:n*5;

out.field3 = coder.nullcopy(s.field3);
for i = 1:n
    out.field3(i) = i*2;
end
end

입력 인수

모두 축소

복사할 변수로, 스칼라, 벡터, 행렬, 구조체 또는 다차원 배열로 지정됩니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | class
복소수 지원 여부:

제한 사항

  • 희소 행렬에는 coder.nullcopy를 사용할 수 없습니다.

  • 오버로드된 괄호를 지원하는 클래스 또는 table처럼 인덱싱을 사용해서 데이터에 액세스해야 하는 클래스에는 coder.nullcopy를 사용할 수 없습니다.

확장 기능

모두 확장

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.

버전 내역

R2011a에 개발됨