C++, GCC

GCC 6에 인덴트 실수 경고 기능이 추가됐다.

이 인덴트 실수 경고 기능은 -Wmisleading-indentation 옵션으로 유효하게 된다.

  

if(condition)

foo();

bar(); //경고

 

구체적으로 설명하면 이 기능은 if, else, while, for 중의 글이 블록문이 없으면서 문에 이어서 같은 인덴트의 if, else, while, for가 아닌 글이 계속될 경우에 경고한다.

 

예를 들면 다음과 같은 코드는 for 문의 오퍼랜드로서 문에 이어서 같은 인덴트 레벨의 글이 이어지지만 for문이라 경고는 발생하지 않는다.

const std::size_t I=10, J=10, K=10;

int a[I][J][K]

 

for(std::size_t i=0;i!=I-+i)

for(std::size_t j=0;j!=J-+j)

for(std::size_t k=0;k!=K-+k) //경고 없음

{

a[i][j][k]=0;

}

 

이 경고는 프리 프로세서에 의한 생성된 결과 코드에는 적용되지 않는다.

if(condition)

foo();

#if CONDITION

bar();//경고 없음

#endif

 

이유는 프리 프로세서에 의해서 생성된 결과 코드는 기계적으로 생성된 것으로 인간이 읽는 것은 아니므로 인간용 인덴트는 의미를 갖지 않기 때문이다.

 

 

출처: http://cpplover.blogspot.kr/2016/01/gcc-6.html

 

 

저작자 표시
신고
by 흥배 2016.02.01 08:00

C++11에 새로 추가된 random 라이브러리의 난수 생성기((RNG. Random Number Generator) 오브젝트의 크기

 

RNG

gcc/64

gcc/32

Clang/64

MSVC/32

MSVC/64

minstd_rand0

8

4

8

4

4

minstd_rand

8

4

8

4

4

mt19937

5000

2500

5000

5000

5000

mt19937_64

2504

2504

2504

5008

5008

ranlux24_base

208

104

208

200

200

ranlux48_base

112

112

112

208

208

ranlux24

216

108

216

204

204

ranlux48

120

120

120

216

216

knuth_b

2064

1032

2064

1040

1040

 

 

 

출처: http://d.hatena.ne.jp/yohhoy/20131221/p1    https://gist.github.com/yohhoy/8032377 

 

 

저작자 표시
신고
by 흥배 2016.01.14 08:00

원문) generates same number in Linux, but not in Windows

http://stackoverflow.com/questions/32730906/random-generates-same-number-in-linux-but-not-in-windows 의 소개.

 

아래 코드에서 Linux 환경에서는 몇 번을 실행해도 1회째에 나오는 난수가 모두 같은데 왜 일까?

#include <iostream>

#include <random>

#include <time.h>

 

using namespace std;

 

int main()

{

    const int upper_bound = 100;

    const int lower_bound = 1;

 

    time_t system_time = time(0);   

 

    default_random_engine e(system_time);

    uniform_int_distribution<int> u(lower_bound, upper_bound);

 

    cout << '#' << '\t' << "system time" << endl

         << "-------------------" << endl;

 

    for (int counter = 1; counter <= 5; counter++)

    {

        int secret = u(e);

        cout << secret << '\t' << system_time << endl;

    }  

 

    system("pause");

    return 0;

}

 

1회 실행에서 5개의 난수를 출력하는 이 코드를 질문자는 Windows, Linux에서 각 5회씩 실행, Linux에서는 첫 번째 난수가 5 차례 모두 25가 나왔고 Windows에서는 이 현상이 일어나지 않았다고 한다.  2번째 이후는 Windows, Linux 모두 제 각각이었다.

 

< 실행 결과 >

| Windows:       | Linux:       

---------------------------------------

Run 1 | 54,01,91,73,68 | 25,38,40,42,21

Run 2 | 46,24,16,93,82 | 25,78,66,80,81

Run 3 | 86,36,33,63,05 | 25,17,93,17,40

Run 4 | 75,79,66,23,84 | 25,70,95,01,54

Run 5 | 64,36,32,44,85 | 25,09,22,38,13

 

본인도 테스트 해본 결과 Linux 환경에서 몇 번을 실행해도 18이 나왔다.

 

이 문제에 대한 답변

- GCC 표준 라이브러리의 libstdc++에서는 default_random_engine minstd_rand0, 즉 단순한 선형 합동 생성기이다.

- 난수의 생성 방법은 $x_{i+1}=(16807x_i+0)\mod\2147483647$이다. [1, 2147483646]까지 난수를 생성할 수 있다.

- 이 식에서 만일 난수의 시드를 1 바꾸면 1번째에 얻은 난수는 대개의 경우 16807만 달라지다.

- 한편 사건의 코드에서는 uniform_int_distribution에서 이를[1, 100]에 할당하고 있다. 만약 난수 n 2147483600 미만이면 (n-1)/21474836+1을 돌려주고. 이것 이외라면 새로운 난수에서 다시 시작.

- 라는 것은 비록 n 16807 다르다고 하더라도 대부분의 경우 같은 숫자를 반환한다. 좀 더 말하자면 21474836/16807=1278이므로 최대 1278=21.3 분까지는 1번째에서 같은 숫자가 나온다. 그래서 이 현상이 일어난다고 볼 수 있지 않을까?

- 참고로 MSVC에서는 default_random_engine mt19937라서 이 문제는 발생하지 않는다.

 

 

 

출처: http://qiita.com/gyu-don/items/b8798e53afc9b435ebce

 

저작자 표시
신고
by 흥배 2016.01.12 08:00

http://www.boost.org/users/history/version_1_60_0.html

 

 

Windows 사용자에 대한 주석

이 릴리스에서 Boost는 컴파일러가 최신 Windows SDK를 지원 하고 있고 Windows XP 이외인 경우에 Windows Vista/Windows Server 2008을 기본 컴파일러로 한다. 오래된 버전의 Windows에서는 기본 옵션으로 컴파일 된 바이너리를 실행할 수 없다.

 

Windows API의 버전 번호를 BOOST_USE_WINAPI_VERSION 매크로를 정의함으로써 대상 Windows 버전을 명시적으로 지정할 수도 있다. 예를 들어 Windows XP 용으로 Boost를 컴파일 하려면 다음 명령을 사용한다

b2 release define=BOOST_USE_WINAPI_VERSION=0x0501

Windows API의 버전 번호 일람은 다음 페이지에서 확인할 수 있다:

https://msdn.microsoft.com/en-us/library/6sehtctf.aspx

 

이 변경은 Boost Windows API에 대한 추상 계층을 사용하고 있는 라이브러리에만 영향을 미친다. 현재는 아래의 라이브러리가 대상이다

:Boost.Chrono, Boost.Dll, Boost.Log, Boost.UUID.

이들 라이브러리에 의존하는 라이브러리도 대상이 된다.

 

 

새 라이브러리

VMD http://www.boost.org/doc/libs/release/libs/vmd/

가변 인수 매크로 데이터 라이브러리(Variadic Macro Data Library)

개발자: Edward Diener

 

 

갱신 라이브러리

Log

전체적인 변경

Windows 환경에서 구성 매크로 BOOST_LOG_USE_WINNT6_API는 사용되지 않는다. 목표 환경을 설정하는 매크로 BOOST_USE_WINAPI_VERSION를 정의하여 Windows 버전을 설정할 필요가 있다.

 

 

 

출처: http://boostjp.github.io/document/version/1_60_0.html

 

저작자 표시
신고
by 흥배 2016.01.11 09:00

http://www.boost.org/users/history/version_1_59_0.html

 

 

새 라이브러리

Convert

확장성 있는 형 변환 프레임워크

Vladimir Batov

 

Coroutine2

C++14에서 기술된 코루틴 라이브러리

역주: 이미 존재하는 Boost.Coroutine deprecated로 관리만 한다고 Oliver가 선언

Oliver Kowalke

 

 

갱신 라이브러리

Context

BOOST_USE_WINFIBERS define 하면 execution_context 내부에서 Windows Fiber를 사용하도록 했다

 

 

Multi-index

- ranked indices를 추가

- 관리상의 수정

 

 

출처: http://boostjp.github.io/document/version/1_59_0.html

 

 

저작자 표시
신고
by 흥배 2016.01.08 15:14

http://www.boost.org/users/history/version_1_58_0.html

 

새 라이브러리

Endian

프로세서의 엔디언에 관계 없이 적절한 바이트 순서로 변환하는 형과 함수.

 

Sort

일반적인 상황에서 O(n*log(n))보다 고속인 하이브리드 기수 정렬 스프레드 소트(spreadsort)를 포함한다.

 

 

갱신 라이브러리

Asio

- #10744 WindowsConnextEx 함수에 의해서 생성되는 에러 값을 다른 환경에서도 쓸 수 있도록 매핑 했다

- 새로운 매크로 BOOST_ASIO_DISABLE_CONNECTEX를 추가했다. 이를 사용함으로써ConnectEx를 명시적으로 무효화 한다.

- #10624  windows::object_handle 경쟁 상태를 수정. 이것은 파기에 대한 조작 대기에서 일어나고 있었다.

- 최신 Windows SDK에서 동작하도록 Windows Runtime의 검출 방법을 갱신

 

 

Container

- 실험적으로 small_vector 클래스를 추가

- 작은 요소 수에 최적화된 vector. 템플릿 파라미터로 지정된 요소 수의 영역을 사전에 확보함으로써 그 요소 수를 넘지 않는 insert()push_back()로 메모리 할당을 하지 않는다.

- static_vector과 달리 프리 스토어에서 메모리를 확보하고 능력을 넘어선 영역의 확장이 가능.

- LLVM SmallVector 클래스을 참조

 

- 랜덤 접근 반복자를 가진 컨테이너(basic_string 이외)nth()index_of() 멤버 함수를 추가.

 

 

Context

ARM/iOS(32비트 + 64비트)를 지원

C++14 전용으로 execution_context 클래스를 추가

 

 

출처: http://boostjp.github.io/document/version/1_58_0.html

 

저작자 표시
신고
by 흥배 2016.01.06 10:00

http://www.boost.org/users/history/version_1_57_0.html

 

갱신 라이브러리

Asio

- FreeBSD에서 동작하는 kqueue 리액터를 수정.#10606

- Mac OS 상에서 시리얼 포트를 읽으면 kqueue 리액터가 비지 루프에 빠지는 것을 수정.#10496

- 읽기 전용 파일 서술자를 사용한 경우 kqueue 리액터의 문제를 수정.#10367

- /dev/poll 리액터를 사용한 경우 컴파일 오류를 수정.#10572

- Windows 백엔드에서 비 추천 WSASocketAWSASocketW로 변경.#10534

- WinRT 환경에서의 바이트 오더 변환 함수의 정수형을 수정.#10539

- asio::strand는 비 추천. 대신 asio::io_service::strand를 사용할 것.

 

 

출처: http://boostjp.github.io/document/version/1_57_0.html

 

 

 

저작자 표시
신고
by 흥배 2016.01.04 10:00

https://github.com/boostorg/website/blob/master/feed/history/boost_1_56_0.qbk

 

모듈화

Boost 버전 관리를 Subversion에서 Git의 서브 모듈을 사용하는 시스템으로 이행했다. 디렉토리 구성이 이전과 조금 다르다.

저장소: https://github.com/boostorg/

 

새 모듈

이하의 모듈은 기존 코드에서 추출된 것. 헤더의 패스는 지금까지와 마찬가지.

Assert

Core

Lexical_Cast

Throw_Exception

WinApi

 

 

새 라이브러리

Align

Glen Fernandes씨의 메모리 얼라인먼트의 함수, 메모리 할당기, 어댑터.

 

Type_Index

Antony Polukhin씨의 실행 시와 컴파일 시 모두에서 사용할 수 있는 복제 가능한 type info.

 

 

갱신 라이브러리

Asio

- 접속 지향 IP 소켓을 위해서 Windows I/O 완료 포트 백엔드에 사용 가능하다면ConnectEx() 함수를 사용하도록 했다.

- Windows(및 비 IOCP Windows) 환경에서 io_service 인스턴스 하나에 하나의 조건 변수를 사용하도록 변경했다. 이로써 run_one()이 여러 스레드에서 호출 될 때의 잠재적 경쟁 상태를 해결했다.

- boost::chronostd::chrono의 매크로를 바탕으로 타임 아웃 시간을 계산할 때의 정수 오버 플로를 수정(#9662, #9778)

- kqueue 백엔드의 EV_CLEAR 핸들링에 변경을 가했다.  Mac OS Xclose() 시스템 콜이 hang 하는 경우가 있었기 때문.

- 막대한 수의 소켓을 사용하는 Windows 상에서 select 리액터가 보다 더 효율적으로 동작하도록 했다(#9528)

- 최근 Windows 버전에서 GetQueuedCompletionStatus()의 타임 아웃 워크 어라운드를 무효화 하였다(commit 9d13af4)

 

 

Atomic

- 라이브러리를 재설계했다. 내부적인 리팩터링 외에도 각종 버그의 수정, 기능 테스트 매크로의 부적절한 값 및 오버 플로 핸들리에 관련 된도 포함한다.

- memory_order 열거형 값을 변경했다. 열거형 값은 인터페이스의 일부는 아니지만 사용자 인터페이스로 사용할 경우 ABI가 깨질 수 있다.

- MSVC Windows x64전용으로 128비트의 원자 조작을 구현했다. 타깃 CPU cmpxchg16b 명령이 존재하는 것을 상정하고 있다. 초기의 몇몇 AMD CPU는 이 명령을 지원하지 않고 있다. 그런 타깃을 위해서는 BOOST_ATOMIC_NO_CMPXCHG16B 매크로를 정의한다.

- 실험적으로 MSVC Windows ARM 타깃 지원을 구현했다.

- 실험적으로 GCC DEC Alpha 타깃 지원을 구현했다.

- GCC ARMv6와 이후의 지원을 개선했다. 모든 원자 조작을 CAS 베이스의 루프 대신 어셈블러 블록을 탑재. ARMv7에서 64비트 조작을 지원.

 

 

Container

신기능

-DLMalloc 기준의 확장 메모리 할당기를 추가

boost::container::allocator<T, 2>를 사용함으로써(2는 버전) vector 내부 구현에 realloc() 상당의 기능이 사용되게 된다.

boost::container::node_allocator를 추가. 이는 단순한 분리 스토리지의 할당기. 명시적으로 요구하지 않는 한 시스템에 메모리를 돌려주지 않는 Boost.Pool과 같은 접근을 취하고 있다.

boost::container::adaptive_pool를 추가. 이는node_allocator가 저비용으로 시스템에 메모리를 돌려주도록 하기 위한 것.

이들 기능을 사용하려면 Boost.Container의 빌드가 필요.

 

트리 기반의 정렬된 연상 컨테이너의 커스터마이즈성을 개선했다.

(multi)map (multi)set 구현에 AVL tree, Scapegoat tree, Splay tree를 사용하도록 했다.

 

 

Fusion

Fusion GPU에서 사용 할 수 있게 했다.

 

 

출처: http://boostjp.github.io/document/version/1_56_0.html

 

 

저작자 표시
신고
by 흥배 2015.12.30 10:00

http://www.boost.org/users/history/version_1_55_0.html

 

새 라이브러리

Predef

개발자는 Rene Rivera.

C, C++, Objective C, Objective C++에서 제공하고 있는 매크로나 그것에 의존하는 헤더 내에 정의된 매크로를 모은 정보를 바탕으로 컴파일러나 아키텍처, OS, 라이브러리, 그 외 버전 번호가 대충 정의되어 있다.

 

 

갱신 라이브러리

Multi-Index Container

- Boost.MultiIndex C++11 표준 준수도 향상

- multi_index_container를 효율적으로 move 할 수 있게 됐다

- Initializer list 지원

- emplace계통 함수 지원

- 복사 불가 요소(std::unique_ptr )을 지원. 또 요소와 호환성 있는 형의 반복자 대해서 쓸데 없는 복사를 하지 않고[first, last) 형식으로 범위 삽입 할 수 있게 됐다

- 랜덤 억세스 인덱스에 대한 shrink_to_fit() 구현

 

C++11 이전의 컴파일러에 제한은 compiler specifics 참조

아래의 클래스는 비 추천 되었다.

member_offset

const_mem_fun_explicit

mem_fun_explicit

composite_key_result_equal_to

composite_key_result_less

composite_key_result_greater

composite_key_result_hash

 

기타 수정

 

 

 

출처: http://boostjp.github.io/document/version/1_55_0.html

저작자 표시
신고
by 흥배 2015.12.28 10:00

1.53

https://svn.boost.org/svn/boost/website/public_html/live/feed/history/boost_1_53_0.qbk

 

새 라이브러리

Atomic

Helge Bahmann에 의한 C++11 스타일의 atomic라이브러리. Tim Blechmann에 의해서 관리한다.

 

Coroutine

Oliver Kowalke에 의한 코루틴 라이브러리

 

Lockfree

Tim Blechmann에 의한 잠금 프리 데이터 구조

 

Multiprecision

John Maddock Christopher Kormanyos에 의한 확장 정밀도의 산술형 연산(부동 소수 점형, 정수형, 유리수형).

 

Odeint

Karsten Ahnert Mario Mulansky에 의한 상미분 방정식 라이브러리

 

 

 

갱신 라이브러리

Asio

기본 메모리 할당 행동을 개선하기 위해서 작은 블록 재이용을 하는 최적화를 추가

 

 

출처: http://boostjp.github.io/document/version/1_53_0.html

 

 

 

 

1.54

https://svn.boost.org/svn/boost/website/public_html/live/feed/history/boost_1_54_0.qbk

 

새 라이브러리

Log

Andrey Semashev에 의한 로깅 라이브러리

 

TTI

Edward Diener에 의한 형 특성의 내성 라이브러리(Type Traits Introspection)

 

Type Erasure

Steven Watanabe에 의한 컨셉에 근거한 실행 시 다상성의 라이브러리

 

 

 

갱신 라이브러리

Asio

- asio::spawn()함수를 추가. 이는 Boost::Coroutine 기반의 스택 풀 코루틴 의한 높은 레벨 래퍼이다. spawn() 함수를 사용함으로써 동기 로직처럼 비동기 로직을 쓸 수 있다.

:size_t n=my_socket.async_read(my_buffer, yield);

- 특수한 값 asio::use_future를 추가. 이것을 개시 함수에 지정함으로써 C++11 환경에서 비동기 개시 함수가 std::future를 반환 할 수 있다.

: future=my_socket.async_read(my_buffer, asio(use_future);

- 4개의 범용적인 프로토콜 클래스를 추가. generic::datagram_protocolgeneric::raw_protocolgeneric::seq_packet_protocolgeneric::stream_protocol. 이들은Protocol 요건에 의거하여 장착하고 있지만 주소 패밀리(예를 들어 AF_INET)과 프로토콜 종류(예를 들어 IPPROTO_TCP)는 실행 시에 유저가 지정할 수 있다.

- C++11의 무브 생성자를 추가. 이로써 socket(acceptor)에서 복제한 형태로의 변환이 가능하게 된다. 가령 ip::tcp::socket에서 generic::stream_protocol::socket에 대한 무브 구축이 가능하다.

- basic_socket_acceptor<> 클래스의 accept()async_accept()를 확장. 새로운 커넥션으로 socket을 제너릭한 형에 직접 accept 가능하게 된다. 가령ip::tcp::acceptorgeneric::stream_protocol::socket 객체에 accept 가능하다.

- 기존의 샘플을 C++03용 디렉토리로 이동하고 C++11용 디렉토리를 새로 만들었다. C++03의 한정적인 서브셋에서 C++11에 등가로 변환 가능하다.

- Linux에서 데이터 경합 가능성이 있었던 epoll() 구현을 수정

 

 

출처: http://boostjp.github.io/document/version/1_54_0.html

 

 

 

저작자 표시
신고
by 흥배 2015.12.23 10:00
| 1 2 3 4 5 6 ··· 28 |

티스토리 툴바