2012-08-12 2 views
1

두 경우를 고려하십시오.정적 멤버 및 정적 전역 메모리

1.) 정적 전역 변수. 지도 파일을 생성 할 때 정적 전역 변수를 .bss 또는 .data 섹션에서 찾을 수 없습니다.

2) 고정 멤버

#include <stdio.h> 
    #include <iostream> 
    #include <vector> 
    #include <list> 
    #include <algorithm> 

    using namespace std; 

    class Tree { 
     struct Node { 
      Node(int i, int d): id(i), dist(d) {} 
      int id; 
      int dist; // distance to the parent node 
      list<Node*> children; 
     }; 

     class FindNode { 
      static Node* match; 
      int id; 
     public: 
      FindNode(int i): id(i) {} 
      Node* get_match() 
      { 
       return match; 
      } 

      bool operator()(Node* node) 
      { 
       if (node->id == id) { 
        match = node; 
        return true; 
       } 
       if (find_if(node->children.begin(), node->children.end(), FindNode(id)) != node->children.end()) { 
        return true; 
       } 
       return false; 
      } 
     }; 

     Node* root; 

     void rebuild_hash(); 
     void build_hash(Node* node, Node* parent = 0); 

     vector<int> plain; 
     vector<int> plain_pos; 
     vector<int> root_dist; 
     bool hash_valid; // indicates that three vectors above are valid 

     int ncount; 
    public: 
     Tree(): root(0), ncount(1) {} 
     void add(int from, int to, int d); 
     int get_dist(int n1, int n2); 

    }; 

    Tree::Node* Tree::FindNode::match = 0; 
... 

변수 트리 :: FindNode이 :: 일치 FindNode 클래스의 정적 멤버입니다. 그리고이 변수는 bss 섹션의 맵 파일에 표시됩니다. 왜 그렇게?

*(.bss) 
.bss   0x00408000  0x80 C:\Users\Администратор\Desktop\яндекс\runs\runs\\000093.obj 
       0x00408000    _argc 
       0x00408004    _argv 
       0x00408020    Tree::FindNode::match 

내가는 MinGW, 운영 체제 창을 사용하여 얻은 7. 모든 오브젝트 파일 g ++ ... CPP -o ... OBJ 명령, LD하여 얻은 맵 파일 .... OBJ-MAP ..... map 명령

답변

5

전역 변수는 이미 정적 메모리에 있으므로 C는 기존 키워드 static을 다시 사용하여 "file-scoped"전역 변수를 만들고 C++가이 제품군을 추적했습니다. 키워드 static은지도 파일에서 전역을 숨 깁니다.

정적 멤버는 클래스 범위이므로 맵 파일에서 사용할 수 있어야합니다. 다른 모듈은 클래스의 정적 멤버, 멤버 함수 및 멤버 변수 모두에 액세스 할 수 있어야합니다. 개별적으로 컴파일 된 경우에도 마찬가지입니다.

+0

감사합니다. 또 하나의 질문입니다, 제발요 - 어떻게 맵 파일에서 정적 변수와 전역 변수를 구별 할 수 있습니까? –

+0

@AlexHoppus C 스타일 정적 변수는 맵 파일에서 제외됩니다. 따라서 맵 파일에서 변수를 볼 때 이름에'::'이 없으면 C 스타일 전역입니다. '::'을 가지고 있다면 그것은 클래스의 정적 멤버이다. – dasblinkenlight

+0

네, 네임 스페이스에 전역 변수가 포함되어 있습니까? namespace :: variable_name –