728x90
반응형

구조체 10

[C#] 구조체와 클래스

C#에서 클래스와 구조체는 C++ 에서처럼 큰 차이는 없다. C++에서 구조체는 기본적으로 public 클래스는 기본적으로 private이라는 것을 제외하면 그냥 동일하다고 생각하고 쓰는 편인데, C#은 그마저도 없어 보인다. // 구조체 public struct Person { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } } // 클래스 public class PersonClass { public string Name { get; set; } public int Age { get; set; } public PersonClass(string name, int age) { ..

Program Language/C# 2023.02.16

[C#] C++ 구조체 사용하기

C#에서 C++의 Lib를 사용해야 하는데, 데이터의 양이 많아서 구조체를 사용해야 했다. 구글링 해보니 정말 많은 글들이 있었고 비슷비슷하면서도 조금씩 달랐다. 옵션들은 사용하지 않아도 되는 것들도 있었고 (성능 향상을 위한 옵션) 아무래도 처음 해보다 보니 쉽지 않았다. 우선 C#과 C++에서 동일하게 사용하는 int, char, double과 같은 변수들은 그냥 사용해도 되지만 대부분의 것들은 마샬링이라는 것을 통하여 사용해야 한다. C++에서 우선 구조체를 선언한다. #pragma pack(push, 1) typedef struct MOTION_PARAM2_T { int axisCount; int axisList[MotionMax_Axes]; double position[MotionMax_Axes..

Program Language/C# 2022.09.16

[C++] 구조체의 필드(field)

이진 변수를 나타내기 위해 전체 byte(char or bool)를 사용하는 것은 고급스러워 보이지만 char는 C++에서 독립적으로 할당되고 주소 지정될 수 있는 가장 작은 객체다. 그러나 구조체의 필드와 같이 여러 개의 작은 변수를 함께 묶는 것이 가능하다. 필드는 종종 bit 필드라고 한다. 구성원은 점유할 비트 수를 지정하여 필드로 정의된다. 이름 없는 필드가 허용된다. 그것들은 명명된 필드의 의미에 영향을 미치지 않지만 일부 machine-dependent 한 방식으로 레이아웃을 개선하는 데 사용할 수 있다. struct PPN { // R6000 Physical Page Number unsigned int PFN : 22; // Page Frame Number int : 3; // unused..

[C++] 구조체의 POD(plain old data)

때때로 객체를 단순하게 "plain old data" (메모리의 연속 byte sequence)로 취급하고 런타임 다형과 같은 고급 개념에 대해 걱정하지 않으려고 한다. 종종 그렇게 하는 이유는 하드웨어가 할 수 있는 가장 효율적인 객체 이동의 방법이기 때문이다. 예를 들어 복사 생성자의 100번 호출을 사용하여 100개의 요소 배열을 복사하는 것은 일반적으로 단순 블록 이동 명령을 사용하는 std::memcpy()를 호출하는 것만큼 빠르지 않을 것이다. 생성자가 inline 된 경우에도 optimizer가 최적화를 발견하기 어려울 수 있다. 이러한 "trick"은 드문 일이 아니며 vector와 같은 컨테이너 구현 및 저수준 I/O 루틴에서 중요하다. 그것들은 불필요하며 상위 레벨 코드에서는 피해야 한..

[C++] 구조체와 배열

당연하게도 배열을 포함하는 구조체와 구체의 배열을 사용할 수 있다. struct Point { int x,y }; Point points[3] {{1,2},{3,4},{5,6}}; int x2 = points[2].x; struct Array { Point elem[3]; }; Array points2 {{1,2},{3,4},{5,6}}; int y2 = points2.elem[2].y; 구조체에 built-in 된 배열은 해당 객체로 취급할 수 있다. 초기화(인수 전달 및 함수 반환 포함) 및 할당에서 배열을 포함하는 구조체를 복사할 수 있다. Array shift(Array a, Point p) { for (int i=0; i!=3; ++i) { a.elem[i].x += p.x; a.elem[i]...

[C++] 구조체와 클래스

구조체는 기본적으로 멤버가 공개되는 클래스다. 따라서 구조체는 멤버 함수를 가질 수 있다. 특히 구조체는 생성자를 가질 수 있다. struct Points { vector elem;// must contain at least one Point Points(Point p0) { elem.push_back(p0);} Points(Point p0, Point p1) { elem.push_back(p0); elem.push_back(p1); } // ... }; Points x0; // error : no default constructor Points x1{ {100,200} }; // one Point Points x1{ {100,200}, {300,400} }; // two Points 단순히 멤버를 순서..

[C++] 구조체 이름

형식의 이름은 선언이 완성된 직후가 아니라 발견된 직후에 사용할 수 있게 된다. struct Link { Link∗ previous; Link∗ successor; }; 그러나 선언이 완성될 때까지 구조체는 새 객체를 선언할 수 없다. struct No_good { No_good member; // error : recursive definition }; 컴파일러가 No_good의 크기를 결정할 수 없기 때문에 이것은 오류다. 두 개(혹은 그 이상)의 구조체가 서로 참조할 수 있도록 하려면 이름을 구조체의 이름으로 선언할 수 없다. struct List; // struct name declaration: List to be defined later struct Link { Link∗ pre; Link∗ ..

[C++] 구조체 layout

구조체의 객체는 선언된 순서대로 멤버를 보유한다. 예를 들면 다음과 같다. struct Readout { char hour; // [0:23] int value; char seq; // sequence mark ['a':'z'] }; 다음과 같이 메모리에 배치된 Readout 객체의 멤버를 상상할 수 있다. 멤버는 선언 순서대로 메모리에 할당되므로 시간의 주소는 값의 주소보다 작아야 한다. 그러나 구조체의 객체 크기가 반드시 해당 멤버 크기의 합일 필요는 없다. 이는 많은 machine이 특정 유형의 객체가 아키텍처의 종속 경계에 할당되거나 그러한 객체가 있는 경우 훨씬 더 효율적으로 처리해야 하기 때문이다. 예를 들면 정수는 종종 단어 word의 경계에 할당된다. 이러한 machine에서 객체는 적절하..

[C++] 구조체 (structure)

배열은 동일한 유형의 요소 집합이다. 가장 단순한 형태의 구조체는 임의 유형의 요소 집합이다. struct Address { const char∗ name; // "Jim Dandy" int number; // 61 const char∗ street; // "South St" const char∗ town; // "New Providence" char state[2]; // 'N' 'J' const char∗ zip; // "07974" }; 이것은 미국 내 누군가에게 메일을 보내기 위해 필요한 항목으로 구성된 Address라는 유형을 정의한다. 종료를 위한 세미콜론(;)을 잊지 말자. Address 유형의 변수는 다른 변수와 똑같이 선언할 수 있으며 개별 멤버는 점(.) 연산자를 사용하여 접근할 수 있..

728x90
반응형