1. chat_room클래스에서 participants_를 저장하는 자료구조로 set을 사용했는데 이 소스 내에서 다른 자료구조말고 set을 사용한 특별한 이유가 있을까요?

 

2. chat_session 클래스의 deliver함수를 보면

메세지큐가 차있을때 플래그가 거짓이 되면서 do_write가 실행이 되고

메세지큐가 비어있으면 플래그가 참이 되면서 do_write가 실행이 안되는구조인데요

만약 write_in_progress에서 큐가 차있는걸 확인 한 후 push_back하려는 중간에 do_write에서 처리를 다 한 후 큐가 비어있다고 판단하고 함수를 종료하면 문제가 생기지 않나요?

큐는 차있는데 do_write함수는 이미 종료된 이후니깐 메세지가 전달이 안되는 문제가 발생할것같은데 만약 안전하게 짠다면 락을 걸어주는게 올바른건가요 아니면 async특성상 이렇게 코드를 짜도 되는건가요?

 

 

Variadic 템플릿을 이용해서 가변 인자를 문자열로 변환하는 함수를 만들고 있는데요. 인터넷에서 찾은 해결책 중에서 아래의 구문이 잘 이해가 되지 않네요. 특히 앞뒤의 0이 무엇을 의미하는지 잘 모르겠습니다.

using List= int[];

(void)List{0, ( (void)(stream << args), 0 ) ... };

이 부분에 관련된 정보는 어디서 찾으면 좋을까요?

아래는 전체 함수입니다.

template< typename ... Args >

std::string stringer(Args const& ... args )

{

std::ostringstream stream;

using List= int[];

(void)List{0, ( (void)(stream << args), 0 ) ... };

return stream.str();

}

initializer_list를 사용하면 좀 더 쉽게 되기는 하는데, 제 경우에는 인자를 레퍼런스로 전달해야 되서...

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

33

Comments

Sang Heon Lee

Sang Heon Lee (exp1, exp2)의 결과는 무조건 exp2입니다. 저 코드는 list 0으로 채우면서 args를 순회하는 코드입니다. elipsis op를 쓸수 있는 곳이 한정적이라 자주 쓰는 테크닉이에요.

See Translation

September 7, 2015 at 9:30am · Like · 4

Deokhwan Kim

Deokhwan Kim 우선 초기화 목록을 사용하여 더미 배열을 선언하는 이유는 pack expansion이 일어나는 곳(, ...을 사용할 수 있는 곳)이 문법상 제한되어 있기 때문입니다. 대략 쉼표를 (연산자가 아닌) 문법상의 구분자로 사용하는 곳들(예를 들어, 함수 호출 인자 목록과 배열 초기화 목록 등) sizeof... 연산자 정도로 국한되어 있습니다.

 

그런데, 배열 초기화 목록을 이용하되 앞쪽 0 없이 List{((void)(stream << args),...See More

See Translation

September 7, 2015 at 10:21pm · Edited · Like · 6

Junyong Park

Junyong Park 두분 다 답변 감사합니다. 처음에는 얼핏 람다 함수인가 했는데, int 배열을 이용한 pack expansion 트릭이었네요. 이제 이해가 좀 가네요.

See Translation

September 7, 2015 at 3:28pm · Like · 1

Minjang Kim

Minjang Kim 네 맞습니다. Pack expansion 하는 트릭입니다. 하재승님의 Crow 강연 슬라이드에도 소개가 되어있고요. SO도 관련 글 찾아 볼 수 있습니다. http://stackoverflow.com/.../variadic-template-pack... 정작 실제 회사 업무에서 이런 거 쓸 일은 거의 없지만요;;

See Translation

 

Variadic template pack expansion

I trying to learn variadic templates and functions. I can't undestand, why this code doesn't compile:…

STACKOVERFLOW.COM

September 7, 2015 at 6:06pm · Like · 4

Lyn Heo

Lyn Heo 저도 하재승님 강의를 보고 저거 뭐지 하고 기겁을 했던 기억이 있네요. 필요성을 전혀 못느끼는 기능이라 저런게 되는지 찾아 볼 생각도 안했었다는 ..

See Translation

September 9, 2015 at 7:32pm · Like

Junyong Park

Junyong Park 저도 꼭 필요한건 아닌데 일반적인 방법으로 풀었을 때 재귀 함수를 2단계 이상 거치는게 싫어서 이 방법을 선택했습니다.

 

 

 

 

 

아까 질문 올렸던 학생입니다.

아까 올린 질문은 너무 정보가 부족한 것 같아 샘플 코드를 작성해 다시 올립니다.

제가 하고 싶은 건

class A singleton으로 하나의 객체만 존재하게 하고

class B로 만들어진 객체들이 A private멤버에 접근할 수 있도록 하는 겁니다.

아래와 같은 코드에서 아래와 같은 오류가 발생합니다.

도움 좀 부탁드립니다...

class.h

#‎pragma once

namespace aa

{

class A;

class B;

class A

{

friend B;

static A* instance;

A();

~A();

int i;

public:

static A* GetInstance();

static void DestroyInstance();

};

class B

{

int i;

public:

B();

~B();

void SetNum();

int GetNum();

};

};

//

Aclass.cpp

#‎include "헤더.h"

aa::A::A() : i(5) {}

aa::A::~A() {}

aa::A* aa::A::GetInstance()

{

if (instance == nullptr)

instance = new A;

return instance;

}

void aa::A::DestroyInstance()

{

if (instance)

{

delete instance;

}

}

//

Bclass.cpp

#include "헤더.h"

aa::B::B() {}

aa::B::~B() {}

void aa::B::SetNum(int _i) { i = _i; }

int aa::B::GetNum() { return A::GetInstance()->i + this->i; }

//

main.cpp

#include <iostream>

#include "헤더.h"

using namespace std;

int main()

{

aa::B b;

b.SetNum(7);

cout << b.GetNum() << endl;

}

//

오류 메시지

Aclass.obj : error LNK2001: "private: static class aa::A * aa::A::instance" (?instance@A@aa@@0PAV12@A) 외부 기호를 확인할 수 없습니다.

c:\users\user\documents\visual studio 2015\Projects\a\Debug\a.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

Comments

Claire Hyunjung Lee

Claire Hyunjung Lee static 변수를 외부에서 초기화 안해주셔서 그래요.

See Translation

Like · Reply · 1 · September 10, 2015 at 12:37am

Claire Hyunjung Lee

Claire Hyunjung Lee 추가적으로 설명드리면 static 변수를 글로벌 변수로 사용하는거기 때문에 딱 한번 초기화되어 있어야 됩니다. 만약 헤더파일에서 클래스 외부에 초기화 하시면 에러 계속 날거구요. 왜냐면 그 헤더파일을 들고 있는 애들이 전부 static 변수를 초기화 하는 걸로 인식하기 때문에 컴파일러가 linking 할때 에러나요. cpp파일 한곳에서 초기화 해주시면 되요.

See Translation

Like · Reply · September 10, 2015 at 12:48am

김민준

김민준 아 원래 코드에는 초기화를 하긴 했는데 헤더파일에 초기화를 해줘서 그랬나 보네요.. 답변 감사합니다

 

 

 

매번 비주얼 스튜디오가지고 라이브러리를 연결시 프로젝트 속성에

C++ -> 일반 -> 추가 디렉토리 와

링커 -> 일반 -> 라이브러리추가가있는데

이 두개의 차이가 궁금합니다.

Have visual studio time library, the connection to the project properties

C++ -> General -> Add and directory

Linker -> General -> Library can add

These two are wondering the difference.

 ·

Rate this translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

33

Comments

Seok-joon Yun

Seok-joon Yun C++ include 에서 찾을 .h찾는곳이고 링커는 .lib 찾는곳입니다

See Translation

Like · Reply · September 25, 2015 at 5:24pm

JiHyung Lee

JiHyung Lee 전자는 헤더 파일의 위치, 후자는 빌드된 lib 파일의 위치입니다.

See Translation

Like · Reply · September 25, 2015 at 5:25pm

정은식

정은식 감사합니다!

See Translation

Like · Reply · September 25, 2015 at 5:30pm

Kim Hwa Su

Kim Hwa Su Library/XML/xml.h 가 있을 경우

소스 코드상에 #include "Library/XML/xml.h"라고 쓸 수도 있고,

만일 추가 디렉토리에 Library/MXL 이 지정되어 있을 경우...See More

See Translation

Like · Reply · 2 · September 26, 2015 at 7:17am · Edited

정은식

정은식 Kim Hwa Su .... 감사합니다!

See Translation

Like · Reply · September 26, 2015 at 8:04am · Edited

 

 

다른 stl 코드는 안봐서 모르겠는데 ms stl 코드중에 std::basic_streambuf이녀석 멤버 _Gcount랑 _Pcount가 왜 std::size_t가 아니라 int인건지 아시는분 계신가요?

64비트 빌드에서는 포인터 크기가 64비트니까 버퍼 길이를 나타내는 저 변수도 64비트여야 되는거 아닌가 싶은데..

Another STL code isn't just that I don't know the code of the stl waits for STD :: Basic _ streambuf this fellow member _ love _ GCOUNT WHY PCOUNT STD :: Speed _ T NOT a reference to the knowledge I'm here?

64-bit build size pointer in 64-bit. Buffer in the length of the variable is my 64-bit, I think..

 · 

Rate this translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

1

1

Comments

Kim Hwa Su 버퍼 길이를 나타낸다면 int라도 충분하지 않나요? 2GB 정도 메모리를 나타낼 수 있는데... 그 정도를 쓰는 string이 필요할지도 의문이고요. string 뿐 아니라 소켓 프로그래밍에서도 아직 send, recv 등의 버퍼 크기는 int로 지정되어 있습니다. 하지만 시간이 오래 지나다보면 바뀔 수도 있겠지요.

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

boost를 받을려고 아래 사이트로 들어가니..

http://boostpro.com/

boostpro 이상한데 접속되는거같은데;;

...See More

See Translation

Dave Abrahams

Follow me on Twitter @DaveAbrahams

DAVEABRAHAMS.COM

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

Comments

View 2 more comments

유근호 Nuget 을 써보셔도 될듯해요See Translation

Like · Reply · September 29, 2015 at 9:50am

정은식 유근호 이미 해결되었습니다 감사합니다 :)See Translation

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

Vector 사용이 익숙치 않아서 질문 드려요.

main 부분의 show와 delete를 완성 하려고 합니다. 어떻게 해야 하나요?

‪#‎include‬ <iostream>

#include <array>

#include <vector>

using namespace std;

struct Trace

{

float* trace;

};

typedef std::vector<Trace> Traces;

Trace* getTrace_omp(int ns)

{

Trace *tr = new Trace();

float *trdata;

float pTrace[] = { 0,1,2,3,4,5,6,7,8,9 };

try { trdata = new float[ns]; }

catch (bad_alloc)

{

cerr << "bad_alloc: " << endl; exit(1);

}

int ltrace = ns*sizeof(float);

memcpy(trdata, pTrace, ltrace);

tr->trace = trdata;

return tr;

}

void getZO_omp(vector<Trace*> *trx)

{

trx->resize(0);

for (int j = 0; j<10; j++) {

trx->push_back(getTrace_omp(10));

}

}

void DataAllDelete(vector<Traces*> &trx)

{

for (auto &i : trx.begin()) {

delete *i;

i = trx.erase(i);

}

trx.clear();

}

int main(int nargs, char **args) {

vector<Trace*>trx;

trx.clear();

getZO_omp(&trx);

//show part

//for (auto &i : trx->begin()) {

// cout << "Val:" << i.trace << endl;

//}

//delete

//DataAllDelete(trx);

}

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

1

1

Comments

Jeon PilGyu show

 

for(auto& i: trx) // try.begin()을 하면 안 됩니다. ...See More

Like · Reply · 1 · November 6, 2015 at 1:02pm · Edited

Jeon PilGyu delete

 

for(auto& i: trx)...See More

Like · Reply · 1 · November 6, 2015 at 1:00pm

DongMin Choi 삭제시에 i.trace뿐 아니라 i역시 delete 해주셔야 메모리 릭이 안날 것 같습니다~See Translation

Like · Reply · 1 · November 7, 2015 at 12:47pm

Jeon PilGyu 아 그러네요See Translation

Like · Reply · November 7, 2015 at 1:09pm

Jeon PilGyu #include <array>

#include <vector>...See More

Like · Reply · 1 · November 7, 2015 at 1:10pm

Jeon PilGyu 이건 재민님이 의도한 거 같은 걸 바꿔본 코드입니다See Translation

Like · Reply · 1 · November 7, 2015 at 1:10pm

이재민 답변 감사 합니다. 제가 의도 한건 값에 접근할 수 있고 다 사용 후에는 memory leak 이 없이 끝나는 건데 delete Function을 따로 구현 해야 하는 거였거든요.다음과 같이 하닌까 leak가 없었습니다.See Translation

Like · Reply · November 7, 2015 at 2:48pm · Edited

Write a reply...

이재민 traces.clear(); 이것만으로도 정상적으로 memory leak가 없어야 하는 거네요 맞나요?See Translation

Like · Reply · November 7, 2015 at 2:47pm

Jeon PilGyu 아뇨 traces.clear()와 릭은 관계가 없습니다 벡터는 자기가 직접 할당한 메모리는 직접 삭제를 하니까요See Translation

Like · Reply · 1 · November 7, 2015 at 5:39pm

Jeon PilGyu 하지만 벡터가 가지고 있는 포인터에 동적 할당된 값들은 자신이 할당한 것들이 아니기 때문에 직접 제거를을 해줘야 하는 거였어요See Translation

Like · Reply · November 7, 2015 at 5:50pm · Edited

Write a reply...

이재민 제가 의도한 코드를 정리 해봤습니다. @전필규 님 코드가 훨 좋은것 같습니다.See Translation

Like · Reply · November 7, 2015 at 3:24pm · Edited

이재민 #include <iostream>

#include <array>

#include <vector>...See More

Like · Reply · 1 · November 7, 2015 at 5:43pm

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

Optimize가 없는 기준으로

const int func() { return 2; }

이라고 정의해둔후에

class 내부에 const int value = func();

라고 정의하고

JIT 으로 func 내부의 return 값을 변경시키면 어떻게되죠?

변경되기 전에 allocate된 class내부에는 2가 그이후에는 다른값이 적용되나요?

아니면 맨 처음의 2의 값이 적용되나요?

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

Comments

Lyn Heo 음... cpp 에 왠 jit?See Translation

Like · Reply · November 4, 2015 at 9:03am

Jun Ryoung Ju 컴파일후에 JIT으로 어셈블리를 변경한다는 의미였어요!See Translation

Like · Reply · November 4, 2015 at 9:04am

Lyn Heo 역시 무슨의민지 모르겠는데..See Translation

Like · Reply · November 4, 2015 at 9:16am

View more replies

Write a reply...

함영택 왜 이런걸 고민하고 계신가요? 하고싶으신게 뭔지 정확하게 알려주시면 답변 해 드리는데 도움에 될 것 같습니다.See Translation

Like · Reply · November 4, 2015 at 9:13am

Jun Ryoung Ju 아아 그냥 순수한 궁금증이라 ㅋㅋㅋSee Translation

Like · Reply · 1 · November 4, 2015 at 9:13am

Jun Ryoung Ju 간단히 class 내부에 const 값이 컴파일될때 한 번만 적용되는지 또는 allocate할때 정의되는지 궁금했던거에요See Translation

Like · Reply · November 4, 2015 at 9:14am

View more replies

Write a reply...

Yeong-cheon You 무슨 질문이신지 알거 같은데요. 간단하게 말씀드리면 class에 코드가 들어갔다고 해서 class의 인스턴스마다 별도 코드의 복사본이 생기는건 아닙니다. 코드는 그냥 공유됩니다. 사실 c랑 별로 다르지도 않아요. 코드는 그냥 c의 함수랑 같고 클래스의 인스턴스 this포인터가 x86기준 ecx레지스터로 항시 전달되고 있을뿐이죠.See Translation

Like · Reply · November 4, 2015 at 1:02pm

Jun Ryoung Ju 흐음 거기까지는 이해했어요!! 이제 그게 class 내부의 const 값을 initialize 할때도 적용되는가에요! const값같은경우에는 변하지 않는다. 를 기본으로 두기때문에 일반 전역 변수와 같이 한 번만 적용이 되는건가요. 아니면 여러개로 변수들끼리 나눠서되는건가요?See Translation

Like · Reply · November 4, 2015 at 3:02pm

Jun Ryoung Ju 문제를 정확하게 짚어주셔서 감사해요 ㅠㅠSee Translation

Like · Reply · November 4, 2015 at 3:02pm

View more replies

Write a reply...

Minjang Kim http://en.cppreference.com/w/cpp/language/constexpr

 

그리고 JIT에 대한 개념이 잘못 되어있습니다.See Translation

constexpr specifier (since C++11) - cppreference.com

The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time. Such variables and functions can then be used where only compile time constant expressions are allowed (provided that appropriate function arguments are given). A constexpr specifi…

EN.CPPREFERENCE.COM

Like · Reply · November 5, 2015 at 6:31am

Jun Ryoung Ju replied · 2 Replies

박재현 JIT의 in-time은 run time이 아니라 execution-time을 의미합니다. 실행 시키는 순간 한번 컴파일해서 번역된 기계어가 캐싱되는거죠. 착각하시는 run-time 번역은 인터프리터의 케이스입니다. 그리고 C++는 컴파일되는 언어이기 때문에 jit와는 연관이 없죠.

덧붙이자면 질문하신 경우와같은 코드는 아예 컴파일 되지 않을겁니다. const 한정자는 말그대로 상수처럼 쓰일 수 없는 녀석은 assign되지 않게 하는 한정자로 생각하시면 쉽겠네요.See Translation

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

 

Memory leak 때문에 메모리사용량 스냅숏을 만드는데 진입 자체가 너무 오래 걸립니다. 릴리즈로 한 5분정도 안에 진입할 코드가 메모리 스냅숏을 하려니 30분 넘게 걸리네요.배보다 배꼽이 커 일 진행이 힘드네요. 머 좋은 꽁수가없을 까요?

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

1

1

Comments

Jun Ryoung Ju 메모리 릭은 대부분 프로그레머의 잘못된 코드로나 실수로부터 발생하니 new 나 delete를 오퍼레이터 오버로딩하신후에 호출순서나 메모리 자체의 포인터를 오버로딩해서 기록해두신 후 천천히 찾아보시면 될듯합니다.See Translation

Like · Reply · 1 · November 24, 2015 at 2:19pm

Gilbert Lee linux 환경의 경우 valgrind를 이용해서 memory leak를 탐지할 수 있습니다.

http://valgrind.orgSee Translation

Valgrind Home

Official Home Page for valgrind, a suite of tools for debugging and profiling. Automatically detect memory…

VALGRIND.ORG

Like · Reply · 1 · November 25, 2015 at 1:59am

Gilbert Lee C/C++ 언어에서는 malloc, free, new, delete를 대표적으로 사용하게 되는데, 이러한 function을 overloading해서 memory leak를 탐지할 수도 있습니다. 예전에 만들어 놓은 소스가 있으니 참고하시기 바랍니다(가끔 현업에서 쏠쏠히 재미를 봤음).

https://github.com/snoopspy/gmemSee Translation

snoopspy/gmem

gmem - G Memory Library

GITHUB.COM

Like · Reply · 1 · November 25, 2015 at 2:01am

이재민 Release 에 debug dll혼합과 같은 방법을 찾고 있어요 단지 원하는 코드의 진입시간을 줄이고 싶거든요. vs2015의 snapshot기능을 쓰는건 유지 하려구요^^See Translation

Like · Reply · November 25, 2015 at 2:02am

Minhyuk Kwon 쌈빡하게 홍보를...http://www.suresofttech.com/ko/products/sniper/See Translation

SNIPER | 슈어소프트테크

» SNIPER |

SURESOFTTECH.COM

Like · Reply · 2 · November 25, 2015 at 2:21pm

Junseong Jang 만약 windows 에서 기본으로 제공해주는 메모리 할당 함수를 사용하고 계신다면 umdh 라는 도구 사용을 검토해보셔도 될 것 같습니다. 그리고 근본적으로는 메모리를 수동으로 할당, 해제하시는 것보다는 스마트 포인터의 사용을 권해드립니다.

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

 

 

 

안녕하세요~ C++에 관심이 많은 학생입니다. 예전에 C++ 11/14 발표가서 무브 시맨틱에 관해서 듣다가 기억이 잘 안나서 그러는데

std::string makeHelloString()

{

return std::string("Hello");

}

int main()

{

std::cout << makeHelloString().c_str() << std::endl; // 복사 생성자 X?

string str = makeHelloString(); // 복사 생성자 1번만?

return 0;

}

라는 코드에서 C++ 11 컴파일러는 알아서 (최적화 빌드를 한다고 가정하면) makeHelloString의 return값을 복사하지 않고 move 해준다는 소리를 들은 것 같은데 혹시 제가 잘못 생각하고 있는건가요?

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

Comments

Lyn Heo 해 줄 수도 있습니다.

사실 C++11 을 지원하지 않는 컴파일러도 해 줄 수 있습니다.

VC++ 같은 경우는 2005 버전부터 해당 최적화를 지원 하고 있는걸로 기억 하고 있습니다.See Translation

Like · Reply · November 29, 2015 at 1:48am

Sangwook Kwon RVO(Return Value Optimization) 을 검색해보시면 될텐데

effective modern C++ 아이템 25번에서 설명하고 있습니다. ...See MoreSee Translation

Like · Reply · November 29, 2015 at 9:35pm

Minjang Kim 윗분 말씀대로 이 경우는 C++11 이전에도 이미 C++ 표준(!)으로 복사를 생략할 수 있었습니다. 보통 RVO 등의 이름으로 불렸는데 C++11 표준부턴 이걸 §12.8.31에서 copy elision으로 명명하고 있습니다. 특정 조건이 만족 되면 복사/이동을 생략할 수 있습니다.http://en.cppreference.com/w/cpp/language/copy_elision clang/gcc에서는 -fno-elide-constructors 옵션이 있습니다. 역시 윗분 말씀대로 로컬 클래서 객체 리턴은 move를 안 쓰는게 낫습니다. 괜히 썼다가 오히려 복사가 일어날 수도 있습니다. C++ move/rvalue가 굉장히 대단한 변화인데 너무 실수할 여지가 많은 것도 사실입니다.See Translation

copy elision - cppreference.com

Under the following circumstances, the compilers are permitted to omit the copy- and move-constructors of class objects even if copy/move constructor and the destructor have observable side-effects.

EN.CPPREFERENCE.COM

Like · Reply · 2 · November 30, 2015 at 4:50am

Lyn Heo replied · 1 Reply

Junyong Lee 아 답변주신 분들 감사합니다! 이해하는데 큰 도움이 되었습니다.

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

안녕하세요.

세마포어(또는 모니터) 개념을 쉽게 사용할 수 있도록 semaphore 클래스(signal, wait 메서드를 가짐)를 만들어 공부하고 있습니다.

그냥 __stdcall(/Gz)로 사용할 때는 문제가 없지만

프로젝트 속성에서 함수 호출 규칙을 __vectorcall(/Gv)로 바꾸면 wait에서 대기하지 않고 그냥 지나가는 것 같습니다.

참고로 VS2015버전을 사용 중이고 x64로 빌드하고 있습니다.

그러면 질문드려도 될까요?

[질문 1]

std::lock_guard나 std::mutex가 멀티 코어(또는 __vectorcall)를 지원하나요?

만약 그렇지 않다면, 다른 종류의 락을 구현하여 사용하여야 하나요?

(이미 사용 가능한 락이 라이브러리에 포함되어 있다면 알려주세요.)

[질문 2]

__vectorcall의 "간단한" 특징과 이점이 궁금합니다.

물론 MSDN을 찾아보았지만... 바로 이해가 되진 않았습니다.

제가 사용한 코드는 아래와 같습니다.

물론 실제 코드는 클래스 선언이 먼저이지만 ... 질문 편의를 위해 아래에 놓은 것 뿐입니다.

// signal 함수

inline void semaphore::signal()

{

std::lock_guard<std::mutex> lock{ mutex };

++count;

cv.notify_one();

}

// wait 함수

inline void semaphore::wait()

{

std::unique_lock<std::mutex> lock{ mutex };

cv.wait(lock, [&] { return count > 0; });

--count;

}

// 세마포어

class semaphore

{

public:

explicit semaphore(size_t n = 0) : count{ n } {};

semaphore(semaphore& s) : count{ s.count } {};

semaphore& operator=(semaphore& s) { return *this; };

semaphore(semaphore &&) = default;

semaphore& operator=(semaphore&&) = default;

void signal();

void wait();

using native_handle_t = std::condition_variable::native_handle_type;

native_handle_t native_handle();

private:

size_t count;

std::mutex mutex;

std::condition_variable cv;

};

inline semaphore::native_handle_t semaphore::native_handle()

{

return cv.native_handle();

}

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

1

1

Comments

View 5 more comments

엄태준 콜링컨벤션은 아실테고 함수호출시 관련리소스를 호출쪽에서ㅎ해제하느냐 호출받는쪽에서 해제하냐 차이인데 아무래도 영향이 있겠죠^^See Translation

Like · Reply · December 3, 2015 at 10:52pm

DongMin Choi 코드를 직접 본건 아니지만

어떨 때는 되었다가, 간혹 안되었다가 하는 상황으로 보아 특정 순서로 스레드가 실행되었을 때 문제가 발생하는 걸수도 있겠네요~See Translation

Like · Reply · December 4, 2015 at 8:54am

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

vs2015 update1에서 c++모듈형식 임포트를 

지원한다고 하네요

예를 들어 a.cpp파일 안에서 module A; 한뒤 원하는 함수 앞에 export 해놓으면

b.cpp 에서 import A; 를 하게될 경우 아까 export한 함수를 쓸수 있다고 합니다!

http://blogs.msdn.com/…/03/c-modules-in-vs-2015-update-1.as…

In Update1 Vs2015 C++ module type im port

That support.

For example a. Cpp File. A) in the presence of the desire to export the function he

B. A IMPORT FROM CPP. Be well, if a export function can write!

http://blogs.msdn.com/…/03/c-modules-in-vs-2015-update-1.as…

 · 

Rate this translation

Like

Like

Love

Haha

Wow

Sad

Angry

Comment

Share

14

14

Comments

Jeon PilGyu 전에 얼핏 봤는데 한번 해봐야겠네요.See Translation

Like · Reply · 1 · December 13, 2015 at 6:28pm

Jeon PilGyu

Like · Reply · December 16, 2015 at 11:47am

Jeon PilGyu 정말 되네요 신기합니다 ^^..See Translation

Like · Reply · 1 · December 16, 2015 at 11:47am

손건 우와 저도 사실 글 올려놓고 해보지 않았었는데 실제로도 되는군요!!See Translation

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

C++ Exception Handling에 관해 다룬 서적을 추천받고 싶습니다.

좋은 책이 있다면 소개해주세요 :)

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

2

2

Comments

손건 제 기억으로 전문가를위한 c++ 2파트에 익셉션핸들링 관련해서 파트가 있었던것 같아요

이책이야 워낙 많이 알고 계셔서See Translation

Like · Reply · 1 · December 16, 2015 at 3:06pm

Seyeon Oh replied · 1 Reply

Chan Ryu 혹시 영어 듣기가 가능하시면 아래 사이트에 링크가 걸린 Jon Kalb의 강의 영상이 (Part 1, 2, 3) 정말 도움이 될 겁니다. Exception handling 의 진수를 보여주는 강의 입니다.

http://exceptionsafecode.comSee Translation

Exception-Safe Coding in C++

During the last two decades he has written C++ for Amazon, Apple, Dow Chemical, Intuit, Lotus,…

EXCEPTIONSAFECODE.COM

Like · Reply · 3 · December 16, 2015 at 8:06pm

Seyeon Oh replied · 1 Reply

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

 

 

http://stackoverflow.com/quest…/1350819/c-free-store-vs-heap

c++에서 new는 free-store에 할당하고 malloc은 heap에다 할당한다고 합니다. 

결국 new의 내부에서는 malloc을 사용하고 실제로는 같은 공간을 사용하지만 new,delete와 malloc, realloc, free를 같이 쓰지 못하게 하려고 이렇게 만들었다고 하네요

See Translation

C++, Free-Store vs Heap

Dynamic allocations with new/delete are said to take place on the free-store,while malloc/free operations use the heap. I'd like to know if there is an actual difference, in practice. Do compilers...

STACKOVERFLOW.COM

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

18

18

Comments

박재현 free store와 heap은 실제 공간도 같은 공간이 아니라고 생각하셔야 합니다. 오버로딩된 new에서 메모리가 아닌 파일을 할당하거나 네트웍 공간을 할당하는 경우도 생각할 수 있기 때문에 말 그대로 new로 할당받을 수 있는 공간으로 해석하시는게 옳다고 봅니다.See Translation

Like · Reply · December 17, 2015 at 2:27pm

Minki Kim c++ 표준에서는 malloc을 heap에 할당한다는 얘기가 없는거로 알고있어요~ stackoverflow에서 얘기하는 내용은 이해를 돕기위한 예제정도이지 정확한 내용은 아닌거 같네요.. 한가지 예로 GotW 9에서는 automatic variable이 stack에 저장된다는 것도 c++의 입장에서는 틀린 얘기겠죠..See Translation

Like · Reply · December 17, 2015 at 2:28pm

엄태준 new 연산자는 오버로딩에 어떻게 하느냐에 따라 역할이 다르겠지만, 크게 App 힙영역만 있는 것으로 알고 있는데요... exe 이미지구조에서 본듯한데....See Translation

Like · Reply · December 17, 2015 at 2:30pm · Edited

Minjang Kim 일단, new 연산자 오버로딩 경우는 고려할 필요가 없고요. 채택된 답변에 동의하지 않습니다. 오히려 그 밑에 달린 댓글에 동의하고요. C++ 표준을 봐도 heap라는 말은 안 나오는데 heap은 구현 종속적인 내용이라 보다 추상화된 free store라는 말을 쓴 것 같네요. 실제 구현에서는 말씀대로 new를 부르면 malloc이 불립니다.

 

더 검색해보면 Stroustrup의 이 논쟁에 대한 답변이 있습니다.http://zamanbakshifirst.blogspot.com/search/label/heapSee Translation

Get Your Computer Science Queries Answered: heap

What's the difference between the heap and the free-store? The C++ Programming Language keeps on referring them interchangeably. There was as huge cry over this issue in C/C++ programmer's community in Orkut. I had to shoot a mail to Dr. Bjarne Stroustrup. Here's our conversation:My Mail:Dear Mr Str…

ZAMANBAKSHIFIRST.BLOGSPOT.COM

Like · Reply · 9 · December 17, 2015 at 3:09pm

Lyn Heo 창시자!!!See Translation

Like · Reply · December 17, 2015 at 3:19pm

Minki Kim 창시자!!!See Translation

Like · Reply · 1 · December 17, 2015 at 3:22pm

Write a reply...

손건 역시 c++는 배울께 넘치네요!

감사합니다See Translation

Like · Reply · 1 · December 17, 2015 at 3:46pm

정은식 C++ 프로그래밍 원리 기초부터 고급까지 읽어보세요See Translation

Like · Reply · 2 · December 17, 2015 at 5:20pm

Kim Hwa Su C++ 실제 구현은 컴파일러 제작사마다 제각각인듯 합니다. 특히 Heap을 다룰때도 조금 다른 면이 있는데, Windows에서 C++ 개발할 경우 Exe와 DLL의 CRT를 /MD, /MT를 각각 다르게 할 경우 각자의 CRT가 사용되어서 서로 다른 Heap을 사용합니다. 즉, 한쪽에서 new를 하고 다른쪽에서 delete를 할 경우 Heap Crash가 발생하는 경우도 있습니다. 예를 들면 std::string의 경우 exe에서 dll의 함수를 호출하면서 인자로 넘길때 exe에서 메모리가 할당되고, dll에서 메모리가 해제되면서 오류가 발생하지만, MFC의 CString은 그런 면까지 고려해서 메모리 할당과 해제가 되도록 설계가 되어있습니다.

즉, 제작사에 따라서 충분히 malloc, new가 서로 다른 메모리 공간을 사용하도록 만들수도 있을 것 같습니다. 하지만 제가 살펴본 컴파일러들은 모두 new에서 malloc을 호출한 후에 생성자를 호출하도록 되어있었습니다. 뭐... 언제든지 바뀔 수도 있는 설계라고 생각합니다. 즉, 꼭 집어서 정답이 뭐라고 하기는 어려울 것 같습니다.

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

안녕하세요 혹시 tdd 기반으로 개발하고 계신분 있나요?

웹기반의 언어들은 tdd가 잘되있어서 쉽게 쓰는데

C기반 언어들은 있을텐데 제가 들어본게 없어서

검색만으로는 판단하기 조금 부족해서 의견 여쭙고 싶어요~

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

Comments

Eundoo Song tdd는 서브 모듈 만들때 가끔 사용하는데, google test를 사용하고 있습니다. tdd는 개발 방법이라 언어종류에 상관없이 사용될수 있다고 생각합니다.See Translation

Like · Reply · 2 · December 24, 2015 at 1:44pm

Lyn Heo tdd랑 쉽게 쓰는거랑 무슨 관계가 있는진 모르겠지만... 하고있는 프로젝트는 꽤 많습니다.

 

예를들면 redis 라던가..(https://github.com/antirez/redis/tree/unstable/tests)See Translation

antirez/redis

redis - Redis is an in-memory database that persists on disk. The data model is key-value, but many different…

GITHUB.COM

Like · Reply · December 28, 2015 at 10:25pm

Lyn Heo 유닛테스트까지 전부 C++로 된건 이런게 있겠네요..

페이스북의 라이브러리입니다. redis 껀 유닛테스트가 아니라 기능테스트 스타일이고(제가 좋아하는 스타일)

 

https://github.com/facebook/folly/tree/master/folly/testSee Translation

Like · Reply · December 28, 2015 at 10:36pm · Edited

Lyn Heo 힙합VM 은 유닛테스트와 기능테스트가 섞인 형태 ..

https://github.com/facebook/hhvm/tree/master/hphp/testSee Translation

facebook/hhvm

hhvm - A virtual machine designed for executing programs written in Hack and PHP.

GITHUB.COM

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

Seok-joon Yun

December 24, 2015 · Seoul

정말 몰라서 하는 질문인데요 ㅠㅠ

void a { T *t = new T(); ... delete t; }

위와 같이하는 것이

void a { T t; ... }

아래보다 더 좋은 점이 있나요?

이럴 경우는 위와 같이 하는게 더 좋다던지...

See Translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

7

7

Comments

Han Jea Jae 전자는 메모리를 힙에 할당하고 후자는 스택 메모리에 할당할텐데,

 

스택 공간을 절약해야하는 상황이 아니라면 스택에 할당하는게 성능상 이점이 있지 않나요?See Translation

Like · Reply · 2 · December 24, 2015 at 10:19am

Han Jea Jae 그러나 위대하신 몇 컴파일러는 저정도는 그냥 스택에 할당하는 최적화를 보여주시지 않을까 싶은데 실제로 어떻게 동작할지는 모르겠네요.See Translation

Like · Reply · 1 · December 24, 2015 at 10:21am

Write a reply...

Eundoo Song 힙을 사용하느냐 스택 사용하느냐의 차이인것 같은데요? 아무래도 스택을 사용하는게 빠를것 같습니다. new를 하면 내부적으로 malloc이 불리는데 이것 또한 함수 콜이고 malloc 자체도 그리 간단치 않는 구현으로 알고 있습니다. 스택인 경우 할당된 스택으로 저장이 되서 활용하는거라 몇개의 어셈 명령어로 구현가능합니다. 레지스터 여유가 있다면 스택을 안쓰고 레지스터에 바로 할당되는 컴파일러 최적화가 있을수 있겠네요. 이러면 메모리 연산을 안하므...See MoreSee Translation

Like · Reply · 5 · December 24, 2015 at 10:31am · Edited

Dongwoo Lee 멀티쓰레드 쓰실 때요.See Translation

Like · Reply · 5 · December 24, 2015 at 10:31am

Dongwoo Lee 아무래도 스택에 생성해놓고 쓰레드 간 공유하면 손이 많이 갈 것 같네요.See Translation

Like · Reply · 1 · December 24, 2015 at 10:33am

Eundoo Song 아 맞네요. 이때 유용합니다. 전 락 구간을 최소화하기 위해 공유자원을 스택에 저장한후 락 release를 합니다.See Translation

Like · Reply · 2 · December 24, 2015 at 10:35am · Edited

View more replies

Write a reply...

박재현 a() 인거죠?? -0-;;See Translation

Like · Reply · 2 · December 24, 2015 at 10:32am

Seok-joon Yun 네 맞숩니당 ㅠㅠ 잘못 썼었네용.See Translation

Like · Reply · December 24, 2015 at 10:33am

박재현 제 경우에는 스코프를 벗어나서 쓰일 이유가 있는 경우를 제외하고는 늘 후자를 사용하는편입니다. 윗 분이 말씀하신 멀티쓰레드의 경우나 재귀호출을 하면서 공유할 데이터인 경우 등은 마찬가지 이유(새로운 스코프 진입)로 전자를 쓰는게 유용하겠구요.See Translation

Like · Reply · 1 · December 24, 2015 at 10:45am · Edited

Write a reply...

Seok-joon Yun 제한재 Eundoo Song 답변 감사 드립니당 ^_^See Translation

Like · Reply · December 24, 2015 at 10:34am

Minjang Kim 송은두님께서 잘 말씀해드렸네요. 약간만 첨언하자면 T가 POD 같은 별도의 힙 할당을 하지 않고 크기가 크지 않다면 후자의 방법, 그냥 스택의 지역 변수로 하는 것이 훨씬 빠릅니다. 말씀하셨듯이 new는 힙 할당을 해야하고 그 자체가 오버헤드이므로 컴파일 시간에 미리 할당되는 스택과 비교하면 오버헤드가 큽니다. 하지만 스택은 보통 그 크기가 작고 (몇 MB) 깨지면 대책이 없으므로 큰 용량이라면 안전하게 new로 하는 것이 좋겠는데요. 보통 POD 객체가 엄청 크지는 않을테니 결국 힙 할당을 할 것이고 최소 객체 자체만이라도 스택에 두는 건 new/delete를 안 해도 되는 등 여러 장점이 있습니다. 자바에서도 로컬 변수가 밖으로 나가지 않는다는 걸 검증할 수 있으면 컴파일러가 해당 변수를 스택으로 바꾸는 최적화를 합니다.See Translation

Like · Reply · 7 · December 24, 2015 at 10:59am · Edited

Chan Ryu 전자는 ... 에서 exception 이 발생하면 memory leak 이 생깁니다.See Translation

Like · Reply · 1 · December 24, 2015 at 6:07pm

Jun Ryoung Ju 속도같은경우에는 메모리를 Lock 해주는걸로 스택과 비슷한 성능을 낼수 있지 않을까요.See Translation

Like · Reply · December 26, 2015 at 2:56pm

Nam Jeongho std::unique_ptr<T> t(new T());

Like · Reply · December 28, 2015 at 11:20pm

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

Lyn Heo

January 7

ifdef ~ else ~ endif 가 매우 복잡하게 얽혀있는 C++ 소스 구합니다.

오픈소스중에 아는거 있으시면 링크 알려주셔도 되고, 공개 가능한 소스라면 올려주시면 감사하겠습니다.

개인적인 용도로 사용하려 합니다.

Ifdef ~ else ~ Cond / / very complicated in C++ Source District.

One of the open-source, if you know a link to the public, jusyeodo source as possible if you put.

Personal purposes to use.

 · 

Rate this translation

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

3

3

Comments

Chan Ryu C++는 아니고 그냥 C 이지만, 제가 아는 최악의 macro hell 은 Vim입니다.

예를 들자면,

https://github.com/vim/vim/blob/master/src/gui.c#L398-L437See Translation

vim/vim

vim - The official Vim repository

GITHUB.COM

Like · Reply · 1 · January 8 at 1:09am

Minjang Kim binutils + gdb 소스코드 아무거나 열어보세요.https://github.com/.../binutils-gdb/blob/master/gas/read.cSee Translation

bminor/binutils-gdb

Unofficial mirror of sourceware binutils-gdb repository. Updated daily.

GITHUB.COM

Like · Reply · 1 · January 8 at 4:53am

Lyn Heo 감사합니다 더 있으신분들은 더 올려주세요See Translation

Like · Reply · January 8 at 7:11pm

Lyn Heo 두분다 감사합니다.

 

덕분에 잘 테스트했습니다....See MoreSee Translation

lynheo/Lyn-EraseIFDEF

Lyn-EraseIFDEF - Remove #ifdef ~ #else ~ #endif from C++ source codes

GITHUB.COM

Like · Reply · 2 · January 12 at 10:29pm

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

 

 

Concurrency in action chapter9 쓰레드풀 소스 코드를 보면서 이것저것 하는중에 재미있는걸 발견해서 질문드려 봅니다.

보통 쓰레드풀 구현할때 hardware_concurrency() 함수에서 리턴되는 하드웨어가 지원하는 스레드 갯수 만큼 만들게 되고 다른 구현들도 그러던데요.

그런데 좀 생각해보니깐 보통 메인 쓰레드는 계속 유지되어있는 상태니깐 분명 hardware_concurrency 개수보다 많겠더라구요 process explorer로 확인해도 그렇구요.

그래서 쓰레드 개수를 hardware_concurrency, hardware_concurrency-1 

두가지 케이스로 나누고 visual studio concurrency시각화 도구를 이용해서 분석을 해 봤는데 쓰레드 갯수 한개 차이 나는데도 선점에 꽤 많은 차이가 나더라구요.

첫번째 사진이 hardware_concurrency-1(쓰레드 개수 4개)

두번째 사진이 hardware_concurrency(쓰레드 개수 5개)

참고로 제 컴퓨터에서 hardware_concurrency리턴값은 4 입니다.

시간측정에서는 큰 차이는 안나지만 조금 있긴하네요

쓰래드 개수 4개

time elapsed : 86.7734 time elapsed : 87.461 time elapsed : 88.5749

쓰래드 개수 5개

time elapsed : 88.519 time elapsed : 89.0126 time elapsed : 89.3743

컴파일 환경은 vs2015 x86 release모드에서 진행했습니다.

테스트 한 코드는 

https://github.com/jen6/ThreadPool_Concurrency_in_action

위 주소 깃헙에 올려두었습니다

제가 궁금한점은

실제 쓰레드 개수 1개 차이 때문에 선점에서 더 많은 비율이 사용될 수 있나요? 아니면 제가 concurrency 시각화 도구를 잘못 사용해서 그런걸까요?

실제 실무에서는 쓰레드풀을 사용 할 때 전체 쓰레드 개수를 고려해서 사용하는지 궁금합니다

See Translation

 

Like

Like

Love

Haha

Wow

Sad

Angry

CommentShare

11

11

Comments

Sang Heon Lee 당연히 cpu core 개수를 고려해서 만들어야하고요, 얼마나 만들지는 어플리케이션 설계에 따라 달라지겠죠. 이 예제에선 요청하는 쓰레드도 바쁘고 처리하는 쓰레드도 바쁘기 때문에 hardware_concurrency - 1만큼 만드는게 맞는 것 같네요. 마지막 작업 요청이 끝난 시간과 완료되는 시간이 거의 차이가 안날테니깐요.See Translation

Like · Reply · 1 · January 11 at 9:11am

Sang Heon Lee 람다안에 sleep을 넣어서 요청이 모두 끝나고 일을 시작하게 해보세요 ㅎㅎSee Translation

Like · Reply · January 11 at 9:34am

김명신 적절한 thread의 갯수는 workload의 특성이 주요하기 때문에 실상 Hardware_concurrency() 등은 참고사항 정도로만 살피는 것이 좋을 것 같습니다.See Translation

Like · Reply · 2 · January 11 at 10:12am

손건 음~ 그러면 결국 작업에 따라서 달라지기 때문에 프로파일링 해본 후에 최적의 개수를 알아내는게 최선이겠군요

hardware_concurrency역시 silver bullet이 아닌걸로 알고있으면 되겠네요 감사삽니다See Translation

Like · Reply · January 11 at 11:44am

김명신 빙고See Translation

Like · Reply · January 11 at 11:51am

Write a reply...

Minjang Kim CPU가 지원하는 논리 CPU 개수보다 많은 스레드를 바쁘게 돌리면 아래쪽 그림과 같이 컨텍스트 스위칭하는 비용이 크게 발생해서 스루풋, 레이턴시, 에너지 모두 손실을 볼 확률이 높습니다. 이건 스레드풀과 꼭 연관이 있는 것이 아니라 컨텍스트 스위칭 비용에 관한 내용입니다. 쿼드코어에서는 당연히 hardware_concurrency가 4를 리턴할 건데요. 이 외의 다른 스레드도 바삐 돈다면 컨텍스트 스위칭이 더 들겠죠. 프로파일링 자료에 잘 보이네...See MoreSee Translation

Like · Reply · 1 · January 11 at 4:13pm · Edited

손건 concurrency in action책에서 점점 쓰레드풀을 발전 시켜 나가는데 맨 앞부분 소스를 그냥 가져다 썻더니 task들이 다끝나기도 전에 소멸자가 호출되버려서요. 귀찮아서 소멸자에다가 큐가 빌때까지 while문 돌려놓는 바람에 그만 =_=...

보통은 작업자 쓰레드만 열심히 돌아야 하나보네요 조언 갑사합니다

시간나면 더 좋은 테스트코드를 작성해보겠습니다See Translation

Like · Reply · 1 · January 11 at 4:31pm

Minjang Kim replied · 5 Replies

신준섭 건아 나도 멀티스렏. 알려줘See Translation

Like · Reply · January 12 

 

출처: <https://www.facebook.com/groups/cppkorea/>

 

ks_wlan_get_auth_mode

bss_config

 

 

https://wikidevi.com/wiki/Wireless_adapters/Chipset_table

\drivers\net\wireless

\drivers\staging\

\net\wireless

 

System.out.println(Arrays.toString(sortedMap.entrySet().toArray()));

 

 

 

//                for (String s : sortedPoints.values())

//                        System.out.println(s);

 

 

 

import java.util.*;

class Solution {

    int solution(int[] A) {

        int n = A.length;

        int[] L = new int[n + 1];

        L[0] = -1;

        for (int i = 0; i < n; i++) {

            L[i + 1] = A[i];

        }

        int count = 0;

        int pos = (n + 1) / 2;

        int candidate = L[pos];

        for (int i = 1; i <= n; i++) {

            if (L[i] == candidate)

                count = count + 1;

        }

        if (count > pos )

            return candidate;

        return (-1);

    }

}

 

 

'Blog History' 카테고리의 다른 글

174  (0) 2020.04.14
173  (0) 2020.04.14
171  (0) 2020.04.14
170  (0) 2020.04.14
169  (0) 2020.04.14

+ Recent posts