C# delegate와 c++ 함수포인터는 다르다.
ex) Action temp = () => { ; } ; 는 선언과 동시에 메모리 할당이 일어난다
char str[] = "abc"; char *str = "abc";
gcc2_compiled.:
.section .rodata
.LC0:
.byte 0x61,0x62,0x63,0x0
str은 .rodata 영역에 있는 "abc"에 대한 포인터 str[]의 경우 함수 호출 시에 .rodata의 "abc" 문자열을 함수의 스택으로 복사
static void Func1(List<int> target,int input)
{
00007FFD576971F0 push rbp
00007FFD576971F1 push rdi
00007FFD576971F2 push rsi
00007FFD576971F3 sub rsp,20h
00007FFD576971F7 mov rbp,rsp
00007FFD576971FA mov qword ptr [rbp+40h],rcx
00007FFD576971FE mov dword ptr [rbp+48h],edx
00007FFD57697201 cmp dword ptr [7FFD5759AD20h],0
00007FFD57697208 je Testtt0809.Program.Func1(System.Collections.Generic.List`1<Int32>, Int32)+01Fh (07FFD5769720Fh)
00007FFD5769720A call 00007FFDB71AD2F0
00007FFD5769720F nop
target.Add(input);
00007FFD57697210 mov rcx,qword ptr [rbp+40h]
00007FFD57697214 mov edx,dword ptr [rbp+48h]
00007FFD57697217 cmp dword ptr [rcx],ecx
00007FFD57697219 call CLRStub[MethodDescPrestub]@7ffd574ffb20 (07FFD574FFB20h)
00007FFD5769721E nop
}
static void Func2(ref List<int> target, int input)
{
00007FFD5769A970 push rbp
00007FFD5769A971 push rdi
00007FFD5769A972 push rsi
00007FFD5769A973 sub rsp,20h
00007FFD5769A977 mov rbp,rsp
00007FFD5769A97A mov qword ptr [rbp+40h],rcx
00007FFD5769A97E mov dword ptr [rbp+48h],edx
00007FFD5769A981 cmp dword ptr [7FFD5759AD20h],0
00007FFD5769A988 je Testtt0809.Program.Func2(System.Collections.Generic.List`1<Int32> ByRef, Int32)+01Fh (07FFD5769A98Fh)
00007FFD5769A98A call 00007FFDB71AD2F0
00007FFD5769A98F nop
target.Add(input);
00007FFD5769A990 mov rcx,qword ptr [rbp+40h]
00007FFD5769A994 mov rcx,qword ptr [rcx]
00007FFD5769A997 mov edx,dword ptr [rbp+48h]
00007FFD5769A99A cmp dword ptr [rcx],ecx
00007FFD5769A99C call System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]].Add(Int32) (07FFD73CD1080h)
00007FFD5769A9A1 nop
}
결론 : 형식의 차이는 있다. 하지만 값의 복사는 참조 위치가 복사될 뿐 딥카피는 일어나지 않는다.
Text Segment or Code Segment
실행가능한 명령어(Instruction)가 포함된 오브젝트 파일 또는 메모리 공간을 할당받은 프로그램 섹션
명령어(Instruction)을 변경하지 못하도록 Read-Only다
일반적으로 텍스트 세그먼트는 공유 가능 하기에 텍스트 편집기, C 컴파일러, 셸같은 프로그램 복사본을 메모리에 저장 후 활용가능
Initialized Data Segment (.data)
초기화된 전역 변수와 Static 정적 변수
읽기 전용 영역(Initialized Read-Only Area)과 초기화된 읽기-쓰기 영역(Initialized Read-Write Area)로 구분
chars s[] = "hello world" 의 경우 "hello world"는 전자, str 은 후자다
Uninitialized Data Segment (.bss)
static int i1 ; int i2 ;
초기값이 없는 정적변수 i1, 전역 변수 i2 는 BSS 세그먼트에 저장된다
Stack Heap