두 경우를 고려하십시오.정적 멤버 및 정적 전역 메모리
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 명령
감사합니다. 또 하나의 질문입니다, 제발요 - 어떻게 맵 파일에서 정적 변수와 전역 변수를 구별 할 수 있습니까? –
@AlexHoppus C 스타일 정적 변수는 맵 파일에서 제외됩니다. 따라서 맵 파일에서 변수를 볼 때 이름에'::'이 없으면 C 스타일 전역입니다. '::'을 가지고 있다면 그것은 클래스의 정적 멤버이다. – dasblinkenlight
네, 네임 스페이스에 전역 변수가 포함되어 있습니까? namespace :: variable_name –