프로그래밍/C++2013.05.18 19:42
int *p1;
struct employee{
  char name[20];
  int age;
  float sal;
} *p2;

p1 = new int;  //allocates 4 bytes
p2 = new employee; //allocates 32? bytes

int *p3;
p3 = new int[30];  //allocates memory for storing 30 inters

delete p1;
delete p2;
delete [] p3;

에 비해, malloc/free를 쓴다면....

p1 = (int*) malloc (sizeof(int));
p2 = (struct employee*) malloc (sizeof(struct employee));
p3 = (int*) malloc (sizeof(int) * 30);

malloc은 void 타입을 리턴하기 때문에, typecasting도 해 줘야 하고,  new의 경우, array dimension을 지원한다.  물론 variable dimension(dynamic size)도 지원한다.
훨씬 낫지 않은가?

그렇다면 new / free, malloc / delete 이런 조합도 가능할가? 안된다.

한가지 더...
new/delete는 오브젝트들을 생성/파괴 할 수 있는 반면, malloc/free는 메모리를 할당/해제 한다.  이는 중요한 부분으로 클래스 생성/파괴에서 new/delete을 쓰는 이유이다.
신고
Posted by code cat
프로그래밍/C++2013.05.11 14:53

c에서 c++함수 호출 시에 역시 extern "c"를 사용하게 되는데, 우선 예를 보자.

 

// gcd.h

#ifdef __cplusplus

extern "C"

#endif

int gcd(int v1, int v2);

 

//gcd.cpp

#include <boost/math/common_factor.hpp>

#include "gcd.h"

extern "C" {

int gcd(int v1, int v2){

return boost::math:gcd(v1, v2);

}

}

 

//sample.c

#include <stdio.h>

#include "gcd.h"

int main()

{

printf("%d와 %d의 최대공약수는 %d(이)다.\n", 14, 35, gcd(14,35));

return 0;

}

 

(위의 예문은 "BINARY HACKS 해커가 전수하는 테크닉 100선, 진명조 옮김" page 74 ~ page 75에서 발췌한 내용이다.)

뭐 다 좋은데, C++에서 저렇게 extern "C"를 함수에 추가해 줄 수 있는 경우가 과연 많을까?  본인 경험상 라이브러리 함수로 받아 수정을 못하는 경우가 태반인데, 과연 저렇게 수정해서 쓸 수 있는 경우가 많을까 고민이다.

 

뭔가 잘못 알고 있는 건 아닐까? 누가 알면 알려줬으면 좋겠다.

신고
Posted by code cat
프로그래밍/C++2013.05.11 12:09

C++에서 C라이브러리 혹은 프로그램 링크시에 우리는 보통 다음과 같이 쓴다

 

extern "C" 함수리턴타입 함수이름(매개변수원형);

 

그런데 이걸 C에서 쓰듯 함수 콜 직전에 불러준다거나 하면(그리 추천하는 방법은 아니다)

 

'expected unqualified-id before string constant' 

 

라는 GR같은 에러가 난다.

이건 C++에서는 클래스 정의나 함수구현 부분에서 "C"코드를 허락하지 않기 때문이다.

 

신고
Posted by code cat
프로그래밍/C++2013.02.02 20:32

예를 들어 c에서 라이브러리로 제공되는 함수가 있다고 하면 c++에서 그냥 c 함수 부르듯이 하면 알 수 없는 link error를 뿜는다.  

어?   분명히 제대로 적었는데... 하고 헤매일텐데, 이것은 syntax error나 라이브러리 링크가 제대로 안되서 그런 것이 아니라, symbol 이름 안 맞아서 그렇다.  이럴 땐, c++ 에서

extern "C" 함수선언

이렇게 해주면 된다.

신고
Posted by code cat

local git에 commit한 뒤, local source control에서만 지우고 싶을 때는(물론 remote 저장소로 업로드가 안되어 있어야겠지)


git rm --cached file_name


으로 지우면 된다.

신고
Posted by code cat
프로그래밍/C++2013.01.01 02:20

class DefaultDevice : public Device {

public:

DefaultDevice() :

ui(new DefaultUI) {

}

...


1. base class 생성자 호출


2. 생성자가 실행되기 전에 초기화 실행

- 상수(const) 멤버 변수 와 같은 경우 변경이 불가능하나,  이런 방식을 통해 변경 시킬 수 있다.

- 클래스 멤버인 reference 를 초기화 시키는 경우


신고

'프로그래밍 > C++' 카테고리의 다른 글

[c++] expected unqualified-id before string constant  (0) 2013.05.11
C++에서 C 함수 사용하기  (0) 2013.02.02
생성자 뒤에 : 붙는 경우  (0) 2013.01.01
cout , endl 의 원리  (0) 2012.04.28
Android Framework 분석을 위한 C++ 4일차  (0) 2012.04.26
[C++] Smart Pointer  (0) 2012.04.25
Posted by code cat
프로그래밍/C2012.11.24 11:13

결론부터 말하면, typedef 과 static은 storage class이기 때문에, 둘다 동시에 사용 못한다.

(우리가 변수를 int와 long으로 동시에 선언하지 못하듯이 말이다.)

 

또한 typedef은 변수를 instance화 시키는게 아니라, type을 선언하는 것이다.  반면에 static은 instance에 적용된다.

신고

'프로그래밍 > C' 카테고리의 다른 글

typedef struct 안에서 스스로를 참조 할 때 주의점  (0) 2013.11.19
symbol visibility  (0) 2013.08.07
typedef 와 static 을 동시에 사용 못하는 이유  (0) 2012.11.24
인라인 어셈블리  (0) 2012.09.25
include guard에 대해서  (0) 2012.09.24
구조체 초기화 방법  (0) 2012.08.21
Posted by code cat
프로그래밍/JAVA2012.10.01 21:20

출처: http://docs.oracle.com/javase/tutorial/java/generics/types.html

 

 

Generics이란?

generics은 class와 interface를 type화 시킬 수 있다.  generics를 사용하면 다음과 같은 이점이 있다.

  • 컴파일 시에 type 체크를 할 수 있다.

컴파일 시에 generic 코드를 체크 함으로써 에러를 미리 방지 할 수 있다.

  • cast를 생략할 수 있다.

List list = new ArrayList();

list.add("hello");

String s = (String) list.get(0);

를 generics을 사용한다면,

 

List<String> list = new ArrayList<String>();

list.add("hello");

String s = list.get(0);

  • generic algorithm을 사용 할 수 있다.

다른 type들로 이루어진 collections에 대한 generic algorithm을 사용할 수 있다.

 

일반적인 Generics  사용법

 

generic class는 다음과 같은 형태이다.

class name<T1, T2, T3, .... Tn> { ... }

 

예제를 통해 보자.

 

generic을 써서 위의 코드를 다시 작성하면,

 

 

보는 바와 같이 Object 대신 type T를 사용할 수 있다.  왜 T냐면.. 보통 다음과 같은 conventions를 따르기 때문이다.

 E

 Element

 K  Key

 N

 Number
 T  Type
 V  Value

 S, U, V

 2nd, 3rd, 4th types

 

 

Generic Type 사용법

 

geneirc Box class를 참조시에 다음과 같이 한다.

Box<Integer> integerBox;

 

위의 경우 Type argument이다. 여기서 Type paramemter 랑 Type argument의 차이점을 보자.

 

Type Parameter and Type Argument Terminology: Many developers use the terms "type parameter" and "type argument" interchangeably, but these terms are not the same. When coding, one provides type arguments in order to create a parameterized type. Therefore, the T in Foo<T> is a type parameter and the String in Foo<String> f is a type argument. This lesson observes this definition when using these terms

 

 

 

 

 

 

 

신고

'프로그래밍 > JAVA' 카테고리의 다른 글

OTA Package Utility  (0) 2013.11.25
Swing desiginer LookAndFeel 종류  (0) 2013.11.19
Java Generics  (0) 2012.10.01
WindowBuilder Pro for Eclipse 3.7(Indigo) 설치 오류  (0) 2012.08.06
ant 빌드가 안될 때  (0) 2011.10.19
Posted by code cat
프로그래밍/C2012.09.25 09:15

    인라인 어셈블리



    1. #if __LINUX_ARM_ARCH__ >= 6

    2. static inline unsigned long arch_local_irq_save(void)

    3. {

    4. unsigned long flags;

    5. asm volatile(" mrs %0, cpsr    @ arch_local_irq_save\n"

    6. "            cpsid i"

    7. : "=r" (flags) : : "memory", "cc");

    8. return flags;

    9. }


 인라인 어셈블리에 대해서 간단히 짚고 넘어가자. 나중에 보면 이해가 안될거 같으니까.

보통 다음과 같은 문법이다.

__asm__ __volatile__ (asms : output: input: clobber);

ANSI에서는 __asm__만 쓰니까, asm 보단 __asm__을 쓰는게 낫다.  volatile(__volatile__)은 최적화를 진행하지 않는다.  컴파일러가 괜히 머리 쓴다고 사용되지 않는다고 판단되는 변수를 없애는 불상사를 방지한다.

asm은 따옴표로 둘러싸인 어셈블리 코드(여기서는 "mrs ... cpsid i"가 되겠다)이며, %와 같은 형태로 input, output parameter를 사용할 수 있다.  컴파일 후, 파라미터가 치환된 대로 어셈블리 코드로 나타난다.

output은 결과값을 출력하는 변수이다. 

"=r"(flags)이다. =는 쓰기전용이란 뜻이다.

input은 output과 같은 방식으로 사용하고, 인라인 어셈블리 코드에 넘겨주는 parameter를 적는다.

clobber는 asm를 실행 시, 값이 변하는 것을 적어준다.  각 변수는 쉼표로 구분되며 각각을 따옴표로 감싸준다. "memory", "cc"가 되겠다.

이제 실제 코드를 분석해 보면,

mrs %0, cpsr 에서는 "=r" (flags)에서, 레지스터 넘버를 flags로 받은 뒤 나오는 레지스터로 cpsr를 저장시킨다. 그 후 cpsid i를 통해 인터럽트를 disable 시킨다. cpsid i는 arm cortex에서 인터럽트를 disable 시킨다. armv7 전용 명령어로 알고 있었는데, ifdef에서 version 6부터 체크하는 걸 보니, armv6에서도 가능한가 보다.

clobber 영역의 "memory"는 컴파일러에게 어셈브릴 코드가 메모리의 어딘가를 변경한다고 가르쳐 주는 것이다. 만약 이렇게 안해주면 컴파일러는 어셈블리코드에서 메모리의 내뇽을 변경하는 것을 컴파일러는 전혀 알 수 없다. "memory"를 명시해 주면, 컴파일러는 어셈블리 코드를 실행하기 전/후에 레지스터에 저장되어 있는 모든 변수의 값을 갱신하도록 한다. "cc"는 컴파일러에게 어셈블리 명령어가 컨디션 코드 플래그를 읽고 쓴다고 알려준다.  설명이 길어졌다. 결국, cpsr를 저장하고 인터럽트를 disable 시킨다.

신고

'프로그래밍 > C' 카테고리의 다른 글

symbol visibility  (0) 2013.08.07
typedef 와 static 을 동시에 사용 못하는 이유  (0) 2012.11.24
인라인 어셈블리  (0) 2012.09.25
include guard에 대해서  (0) 2012.09.24
구조체 초기화 방법  (0) 2012.08.21
error: expected identifier before numeric constant  (0) 2012.07.03
Posted by code cat
프로그래밍/C2012.09.24 13:58

include guard란 실수로 인해 같은 header 파일이 한번 이상 include되는 걸 막는 방법이다.


아래 예제를 보자.


basic.h


intermediate.h


expert.c


보는 바와 같이 expert.c에서 basic.h를 두번 include하는 결과가 되었다. (라인1에서 한번, 라인 2의 intermediate.h는 결국 basic.h를 include한다)


그래서 이러한 상황을 막기 위해 헤더파일을 정의 할 때 다음과 같이 basic.h에 중복 정의를 막는 매크로를 사용한다.

basic.h  (modified)

 

이러한 예제만 보면 별거 아닌거 가지고 저러나 싶겠지만, 파일 수십가지 수백가지가 되면 의도치않게 중복으로 include하게 된다.

신고
Posted by code cat

티스토리 툴바