반응형

동적 메모리 할당

  • 동적 메모리 할당이 필요한 이유
    • 실행 시간에 결정된 크기 만큼의 메모리를 할당하고 싶을때
    • 자동으로 메모리를 해지 하지 말고, 사용자가 원할때 명시적인 해제를 위해
  • C 언어
    • malloc으로 할당하고 free로 해지
    • malloc 사용시 주소를 원하는 타입으로 캐스팅 필요
  • C++ 언어
    • new로 할당하고 delete로 해지
    • 원하는 타입의 주소를 리턴하므로 캐스팅 불필요
    • new 배열로 할당한 경우 delete[]로 해지(배열을 delete로 해지 시 동작에 대해서는 알수없음 undefined)
    • malloc은 생성하지 호출하지 않지만 new는 생성자를 호출함
int main()
{
    int cnt = 0;

    std::cout << "학생수 ? >>";
    std::cin >> cnt;

    // 학생수 만큼의 메모리 할당이 필요하다.
    int score[cnt]; // g++ ok, vc++ error

    // C Style
    int* p1 = (int*)malloc(sizeof(int) * 10);
    free(p1);

    // C++ Style
    int* p2 = new int; // int 사이즈 할당(4Byte)
    delete p2; // 

    int* p3 = new int[10]; // int 사이즈 배열 할당(4Byte * 10)
    delete[] p3; // new Array 타입으로 생성 시 delete[]로 해지
}
반응형

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

C++ Explicit Casting  (0) 2019.05.06
C++ reference 변수  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05
C++ 함수 특징 #1  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16

반응형

Delete Function(명시적 삭제)

  • 특정 타입의 함수를 제공하지 않을 경우 인자 형변환으로 호환 가능한 함수를 호출함
  • 특정 타입의 함수를 선언만 하면 해당 함 수 사용시 링크 에러 발생
  • 해당 함수를 명시적 삭제(delete)하면 함수 사용시 컴파일 에러 발생
template<typename T>
T Square(T a)
{
    return a * a;
}

void Foo(int a) {}
void Foo(double a) = delete; // double 타입 파라미터 Foo 함수를 명시적 삭제

double Square(double) = delete; // 템플릿에서 double 타입만 제공하지 싶지 않을때

int main()
{
	Foo(3.4); // 명시적 삭제하지 않았을 경우 형변환 되어 Foo(int a) 함수가 실행됨
    Foo(3.4); // 명시적 삭제 상태일때는 컴파일 에러 발생(deleted function error)
    Square(3.4); // 템플릿 함수이지만 double 타입 함수는 삭제됨 에러 발생
}

 

Suffix Return Type

  • C++11 이상
  • 리턴 타입을 함수() 뒤에 적는 표기법
  • suffix return or trailing return 이라고 함
  • 원래의 리턴 값 위치에는 auto를 표기
  • 람다 표현식이나 함수 템플릿을 만들때 많이 사용
template<typename T, typename U>
auto Add(T a, U b) -> decltype(a + b) // 리턴타입이 함수 정의부 이후에 결정이 필요할 경우
{
    return a + b;
}

int main()
{
    Add(1, 2.2); // 템플릿 함수를 호출 시 인자 타입이 상이할 경우 템
}

 

Constexpr Function

  • C++11 이상
  • 함수 인자로 컴파일 시간에 결정될 수 있는 상수 값이 전달 될 경우 컴파일 시간에 연산을 수행하는 함수
  • 함수 인자가 컴파일 시간에 결정되는 상수가 아닌 경우 일반 함수와 동일하게 동작함
  • 함수 호출 구문을 배열의 크기나 템플릿 인자등 컴파일 시간 상수가 필요한 곳에서 사용 가능
  • 라이브러리 설계에서 많이 사용됨
constexpr int Add(int a, int b)
{
    return a + b;
}

int main()
{
    int n2 = Add(1, 2);
}
반응형

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

C++ reference 변수  (0) 2019.05.06
C++ new  (0) 2019.05.06
C++ 함수 특징 #1  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16
C++ 변수의 특징(variable) #2  (0) 2019.01.15

반응형

Default Parameters

  • 함수 호출시 인자 전달을 생략하면 기본값이 적용된다.
  • 주의 사항
    • 함수의 마지막 파라미터부터 역순으로만 지정 가능
    • 헤더파일로 분리된 함수의 경우 선언에만 기본값을 정의 한다.(구현부
// 선언부, 구현부 분리 시 선언부에만 기본 파라미터 정의
void func1(int x, int y = 0, int z = 0);

// 구현부 가독성을 위해서 필요시 주석으로 표현
void func1(int x, int y /*= 0 */, int z /*= 0 */)
{
}

int main()
{
    func1(1, 1, 1); // 파라미터 기본값 사용 안함
    func1(1, 1); // 파라미터 기본값 z 사용
    func1(1); // 파라미터 기본값 y, z 사용
}

 

Function Overloading

  • 인자의 개수나 타입이 다르면 동일 이름의 함수를 2개 이상 만들 수 있음
  • 사용자 입장에서 일관된 함수를 제공 가능
  • 주의사항
    • 디폴트 값이 있는 함수에서는 주의 필요
    • 리턴 타임만 다른 경우는 오버로딩 불가
int square(int a)
{
    return a * a;
}

double square(double a)
{
    return a * a;
}

int main()
{
    square(1); // 정수 파라미터 함수 호출
    square(1.1); // 실수 파라미터 함수 호출
}

 

Inline Function

  • 함수 호출 시 실제 함수로 이동하지 않고 함수의 기계어 코드로 치환함
    • 장점 : 빠름
    • 단점 : 치환되는 함수가 클 경우 목적코드(실행파일)이 커질 수 있음
  • 인라인 상태 확인 방법
    • cl : 이름.cpp /FAs /Ob1 -> 이름.asm
    • g++ : 이름.cpp -S -02 -> 이름.s
  • 헤더파일에 구현부를 제공하여야 함
int add1(int a, int b)
{
    return a + b;
}

inline int add2(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 1, b = 2;
    int n1 = add1(a, b); // 어샘블리어로 변환 시 함수 호출
    int n2 = add2(a, b); // 어샘블리어로 변환 시 함수자체로 치환
}

 

Template Function

  • 실제 함수가 아닌 함수를 만들어 내는 틀(template)
  • 사용자가 템플릿을 호출하는 코드를 보고 컴파일러가 필요한 타입의 함수를 생성
  • 템플릿 인자 표기는 "typename" 또는 "class"를 사용
  • 함수 뿐 아니라 구조체(or 클래스)도 템플릿으로 만들수 있음
  • 잘못 사용시 코드 메모리가 커질 수 있음(Code Bloat 현상)
// 함수를 만들어 내는 틀
template<typename T>
T square(T a)
{
    return a * a;
}

int main()
{
    square<int>(3); // int square(int) 함수 생성
    square<double>(3.3); // double square(double) 함수 생성
    
    square(3); // 생략시 타입 추론으로 int square(int) 함수 생성
    square(3.3); // 생략시 타입 추론으로 double square(double) 함수 생성
}
template<typename T>
struct Point
{
    T x;
    T y;
};


int main()
{
    Point<int> p1; // 멤버가 int인 Point 구조체 생성
    p1.x = 3;

    Point<double> p2; // 멤버가 double인 Point 구조체 생성
    p2.x = 3.3;
}
반응형

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

C++ new  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16
C++ 변수의 특징(variable) #2  (0) 2019.01.15
C++ 변수의 특징(variable) #1  (0) 2019.01.14

반응형
폴더블 폰을 접었을 때 앱은 작은 화면(Cover Display)에서, 펼치면 큰 화면(Main Display)에서 실행 됩니다.

이 때, 안드로이드 폴더블 폰에서는 Configuration에 대한 변경이 발생되며, 해당 변경으로 인해 앱의 상태가 변하게 됩니다.

기본적으로 아무런 조치를 하지 않은 앱은 activity가 종료가 되었다가 다시 생성되게 되며, 이 경우 사용자는 현재 화면에 대한 정보를 잃게 됩니다.

즉, folding / unfolding 시 발생되는 이벤트는  smallestScreenSize, screenSize, screenLayout 이며, 이 이벤트들에 대한 별도 처리를 하지 않은 앱에서는 activity가 종료되었다 재실행되는 현상을 겪게 됩니다.

따라서, 사용자가 폴더블 폰에서 앱의 연속성을 갖고 사용할 수 있도록 하기 위해, 앱의 activity를 확인하여 configuration 변경에 따른 처리를 해 주셔야 합니다.
 
특히, 원스토어 결제화면이 노출되어 있는 상황에서 configuration 변경이 발생하고, 앱이 이에 대한 적절한 처리가 되어 있지 않을 경우 사용자는 결제완료 후 아이템을 받지 못하는 상황이 발생되므로, 앱 연속성(App continuity) 제공은 필수입니다.

제공 방법은 두 가지가 있는데, 원스토어 결제 화면을 호출하는 activity에서 onSaveInstancesState 방식 보다 AndroidManifest의 configChanges를 이용하여 activity가 종료되는 것을 막는 방식으로 적용해 주시기 바랍니다.
 
자세한 사항은 폴더블 폰이 최초 출시될 것으로 예상되는 삼성전자의 아래 Technical Document를 참고하시기 바랍니다.









출처 : 원스토어 공지사항(https://dev.onestore.co.kr/devpoc/support/news/noticeView.omp?noticeId=31899)


반응형

반응형

Gradle 빌드시에 이런 에러가 뜬다면

com.crashlytics.tools.gradle.CrashlyticsPlugin.findObfuscationTransformTask


fabric 1.28.0 버그인것 같다.
아래와 같이 최신버전을 사용하도록 해놓았다면
classpath 'io.fabric.tools:gradle:1.+'

아래 버전인 1.27.1로 명시해서 사용하면 해결된다.

classpath 'io.fabric.tools:gradle:1.27.1'


반응형

반응형

타임존 옵셋으로 호출시 정상 동작 하지만

SELECT CONVERT_TZ('2008-05-15 12:00:00','+00:00','+10:00');


아래와 같이 타임존으로 호출시 에러가 난다면 MariaDB or MySQL 기본 타임존 설정 후 Timezone 테이블의 데이터 셋팅이 필요하다.

SELECT CONVERT_TZ('2008-05-15 12:00:00','UTC','Asia/Seoul');


https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html


Linux 계열의 OS는 가이드에 나와있는 시스템 타임존 정보를 이용하여 셋팅이 가능하고

Windows OS라면 별도의 SQL 파일을 받아서 교체하는 방식으로 적용이 가능한데, 아래의 URL에서

POSIX 표준(timezone_2018i_posix.zip)으로 받으면 된다.


https://dev.mysql.com/downloads/timezones.html



반응형

반응형

namespace ENamedThreads

{
    enum Type
    {
        UnusedAnchor                     = -1,
        RHIThread,
        AudioThread,
        GameThread,
        ActualRenderingThread            = GameThread + 1,
        AnyThread                        = 0xff,
        MainQueue                        = 0x000,
        LocalQueue                       = 0x100,
        NumQueues                        = 2,
        ThreadIndexMask                  = 0xff,
        QueueIndexMask                   = 0x100,
        QueueIndexShift                  = 8,
        NormalTaskPriority               = 0x000,
        HighTaskPriority                 = 0x200,
        NumTaskPriorities                = 2,
        TaskPriorityMask                 = 0x200,
        TaskPriorityShift                = 9,
        NormalThreadPriority             = 0x000,
        HighThreadPriority               = 0x400,
        BackgroundThreadPriority         = 0x800,
        NumThreadPriorities              = 3,
        ThreadPriorityMask               = 0xC00,
        ThreadPriorityShift              = 10,
        GameThread_Local                 = GameThread | LocalQueue,
        ActualRenderingThread_Local      = ActualRenderingThread | LocalQueue,
        AnyHiPriThreadNormalTask         = AnyThread | HighThreadPriority | NormalTaskPriority,
        AnyHiPriThreadHiPriTask          = AnyThread | HighThreadPriority | HighTaskPriority,
        AnyNormalThreadNormalTask        = AnyThread | NormalThreadPriority | NormalTaskPriority,
        AnyNormalThreadHiPriTask         = AnyThread | NormalThreadPriority | HighTaskPriority,
        AnyBackgroundThreadNormalTask    = AnyThread | BackgroundThreadPriority | NormalTaskPriority,
        AnyBackgroundHiPriTask           = AnyThread | BackgroundThreadPriority | HighTaskPriority,
    }
}


반응형

반응형

제어판에서 .NET Framework 3.5를 사용하도록 설정

Windows 제어판을 통해 .NET Framework 3.5를 사용하도록 설정할 수 있습니다. 이 옵션을 사용하려면 인터넷에 연결해야 합니다.

  1. 키보드에서 Windows 키 Windows 로고를 누르고, “Windows 기능”을 입력한 후 Enter 키를 누릅니다. Windows 기능 사용/사용 안 함 대화 상자가 나타납니다.

  2. .NET Framework 3.5(.NET 2.0 및 3.0 포함) 확인란을 선택하고, 확인을 선택하고, 메시지가 표시되면 컴퓨터를 다시 부팅합니다.

    제어판으로 .NET 설치

    이 기능이 필요한 개발자 또는 서버 관리자가 아니라면 WCF(Windows Communication Foundation) HTTP 활성화 및 WCF(Windows Communication Foundation) 비 HTTP 활성화를 위한 자식 항목을 선택할 필요가 없습니다.

.NET Framework 3.5 설치 문제 해결

설치 중 0x800f0906, 0x800f0907, 0x800f081f 또는 0x800F0922 오류가 발생할 수 있습니다. 이 경우 .NET Framework 3.5 설치 오류: 0x800f0906, 0x800f0907 또는 0x800f081f를 참조하여 이러한 문제 해결 방법을 확인하세요.

여전히 설치 문제를 해결할 수 없거나 인터넷에 연결되어 있지 않으면 Windows 설치 미디어를 사용하여 설치를 시도할 수 있습니다. 자세한 내용은 Deploy .NET Framework 3.5 by using Deployment Image Servicing and Management (DISM)(DISM(배포 이미지 서비스 및 관리)을 사용하여 .NET Framework 3.5 배포)를 참조하세요. 설치 미디어가 없는 경우 Windows용 설치 미디어 만들기를 참조하세요.

 경고

.NET Framework 3.5 설치용 원본으로 Windows 업데이트를 사용하지 않는 경우 동일한 Windows 운영 체제 버전의 원본만을 사용해야 합니다. 동일한 버전의 Windows에 해당하지 않는 원본 경로를 사용하면 .NET Framework 3.5와 일치하지 않는 버전이 설치되지 않습니다. 그러나 이로 인해 시스템이 지원되지 않고 서비스를 제공할 수 없는 상태가 됩니다.


반응형

+ Recent posts