[STL 소스 분석] 곤혹스러운 문법

4880 단어 독서 노트

곤혹스러운 문법


obj * volatile * my_free_list의 의미


이 성명의 원래 형식은:obj**myfree_list, 이렇게 하면*myfree_list (빈 메모리 블록 포인터 그룹의 요소) 는 레지스터에 최적화되어 라이브러리 코드를 읽기 전용에 사용할 수 없습니다. (레지스터에 있으면 다른 라인이 무의식중에 레지스터의 값을 수정할 수도 있고, 메모리에 다른 라인이 접근할 권리가 없기 때문에 수정할 수 없습니다.)변수가 메모리에 있어야 한다고 설명하려면volatile로 수식해야 합니다. 여기 수식된 것은 my 입니다.free_list,freelist 수조의 원소가 수조 바늘이 아니라volatile는 두 중간에 놓여 있습니다.

애써 임시 대상을 만들다


애써 임시 대상을 만들다.예를 들어string("hello");int(2);중의 Hello, 2는 모두 이름 모를 임시 대상이다.

정적 상수 정수 구성원이class 내부에서 직접 초기화


class 클래스의 constatic integral data member, 클래스에 직접 초기 값을 부여할 수 있습니다.이것은 C++ 표준입니다.integral은 모든 정형을 가리킵니다 (char,long...)

매크로 정의


define __STL_TEMPLAE_NULL template<>


GCC, VC6에서template<>를 지정하지 않으면 특정 유형을 지정할 수 있습니다

define __STL_NULL_TMPL_ARGS <>


이러한 설명은bound friend templates를 실현하기 위한 것이다. 즉, 템플릿 클래스의 특정한 실현은 우원류의 특정한 실현과 일일이 대응한다.예를 들어 조작부호를 다시 불러옵니다.자세한 내용은 P33 참조

주의할 점


T1 *pt1 = new(p) T1(value)


T1 *pt1 = new (p) T1 (value) 은placement new라고 하는데, 포인터 p (p는 T1 형식) 가 가리키는 메모리 공간에 T1 형식의 대상을 만듭니다.물론 구조된 이 대상은 호출된 분석 함수를 표시해야 합니다: pt1->~T1 (), delete로 완성할 수 없습니다.more Effective C++ M8 참조

set_new_handle(0)


set_new_handle (0) 은 Operator new가 메모리를 신청하는 데 실패했을 때 0을 되돌려주고 STL이 메모리 부족 상황을 스스로 처리한다는 뜻이다.set_new_handle () 의 원형은 다음과 같습니다.
typedef void (*new_handler)(); //       ,         。
new_handler set_new_handler(new_handler p) throw();//operator new           p      。           。

operator new가 메모리 분배 요구를 충족시키지 못할 때 setnew_handle () 반환 new충분한 메모리를 찾을 때까지 handler 함수입니다.따라서 new 를 잘 설계해야 한다handler 함수, 디자인이 좋은 newhandler 함수는 다음과 같은 일을 해야 한다. 1. 다른 쓸모없는 메모리를 삭제하여 시스템이 더 많은 메모리를 사용할 수 있도록 하고 다음 단계의 메모리 신청을 준비해야 한다.이 정책을 실현하는 방법은: 프로그램이 실행되기 시작하면 큰 메모리를 분배합니다. newhandler가 호출되었을 때, 그것들을 프로그램에 풀어서 사용하도록 합니다.
2、다른 new 설정handler. 현재 newhandler는 더 많은 메모리 신청 작업을 할 수 없거나 다른 new 를 알고 있습니다.handler 할 수 있으면 set 호출 가능new_handler 함수 다른 new 설정handler, 이렇게 하면operator new가 다음에 호출될 때 이 새 new 를 사용할 수 있습니다handler.
3、제거 newhandler,operator new를 다음 호출할 때, 왜냐하면 newhandler가 빈 메모리를 위해 이상을 신청합니다.
4、new_handler 사용자 정의 이상 던지기
5, 다시 되돌아오지 않음, abort 또는 exit 종료 프로그램 호출

ptrdiff_t


두 포인터의 상감 결과 유형은 ptrdifft, 기호가 있는 정수 형식입니다.감법 연산의 값은 두 바늘이 메모리에 있는 거리(수조 원소의 길이가 바이트가 아닌 단위)이다. 감법 연산의 결과는 수조 원소 유형의 길이로 나뉘기 때문이다.그래서 이 결과는 수조에 저장된 요소의 유형과 무관하다.
size_t는 unsigned 형식입니다. 그룹의 길이나 하표를 가리키는 데 사용되며, 정수여야 합니다. std::sizet. 디자인 크기t는 여러 플랫폼에 적응하기 위해 프로그램을 도입하여 서로 다른 플랫폼에서 이식성을 강화했다.
ptrdiff_t는signed 형식으로 같은 그룹의 두 바늘 사이의 차이를 저장하는 데 사용됩니다. 마이너스로 사용할 수 있습니다. std::ptrdifft. 동상, ptrdiff 사용t에서 플랫폼에 독립된 주소 차이를 얻습니다.
size_type은 unsigned 형식으로 용기에 있는 원소의 길이나 하표를 표시합니다.vector::sizetype i = 0;
difference_type은signed 형식으로 교체기의 차이를 나타냅니다.vector::differencetype = iter1-iter2.앞의 두 가지는 표준 라이브러리 std 안에 있고 뒤의 두 가지는 STL 대상에 의해 소유된다.

조작부호 재부팅 p38

int& operator*()const
{
return (int&)m_i
}

(int&)m_i 컴파일러에 const int를non-const lvalue로 바꿔야 한다고 알려 줍니다.이렇게 하면 대상을 왼쪽 값으로 편리하게 할 수 있다.불명확한 변환은 경고나 오류를 알릴 수 있습니다.

교체기는 전폐후개 구간 표시 [)


이른바 전폐후개[first,last)란 전체 범위가first에서 시작하여last-1이 끝났다는 것을 안다는 뜻이다. 이렇게 하면 알고리즘의 순환 설계를 깔끔하게 할 수 있다.
for(;first != last; ++first) {//...}

function call 연산자(operator()


만약class에 대한operator () 재부팅을 진행한다면, 이것은 모조 함수가 될 것입니다.함수 포인터를 나타낼 수도 있고 전체 조작을 나타낼 수도 있다.
template<class T>
struct plus{
T operator()(const T& x,const T& y) const{return x + y;}
};

위쪽은 가장 간단한 모조 함수로 아직 배급 능력을 갖추지 못했다.하지만 이렇게 사용할 수 있다.
plus<int> plusobj;
int a = plusobj(2,3);

좋은 웹페이지 즐겨찾기