Maison > Questions et réponses > le corps du texte
Je ne comprends pas la syntaxe de la classe VALUE_OBJ_CLASS_SPEC
, pourquoi la classe peut-elle être suivie de 2 noms de classe ?
class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
protected:
HeapWord* _bmStartWord; // base address of range covered by map
size_t _bmWordSize; // map size (in #HeapWords covered)
const int _shifter; // map to char or bit
BitMap _bm; // the bit map itself
public:
// constructor
CMBitMapRO(int shifter);
enum { do_yield = true };
// inquiries
HeapWord* startWord() const { return _bmStartWord; }
size_t sizeInWords() const { return _bmWordSize; }
// the following is one past the last word in space
HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
// read marks
bool isMarked(HeapWord* addr) const {
assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
"outside underlying space?");
return _bm.at(heapWordToOffset(addr));
}
// iteration
inline bool iterate(BitMapClosure* cl, MemRegion mr);
inline bool iterate(BitMapClosure* cl);
// Return the address corresponding to the next marked bit at or after
// "addr", and before "limit", if "limit" is non-NULL. If there is no
// such bit, returns "limit" if that is non-NULL, or else "endWord()".
HeapWord* getNextMarkedWordAddress(const HeapWord* addr,
const HeapWord* limit = NULL) const;
// Return the address corresponding to the next unmarked bit at or after
// "addr", and before "limit", if "limit" is non-NULL. If there is no
// such bit, returns "limit" if that is non-NULL, or else "endWord()".
HeapWord* getNextUnmarkedWordAddress(const HeapWord* addr,
const HeapWord* limit = NULL) const;
// conversion utilities
HeapWord* offsetToHeapWord(size_t offset) const {
return _bmStartWord + (offset << _shifter);
}
size_t heapWordToOffset(const HeapWord* addr) const {
return pointer_delta(addr, _bmStartWord) >> _shifter;
}
int heapWordDiffToOffsetDiff(size_t diff) const;
// The argument addr should be the start address of a valid object
HeapWord* nextObject(HeapWord* addr) {
oop obj = (oop) addr;
HeapWord* res = addr + obj->size();
assert(offsetToHeapWord(heapWordToOffset(res)) == res, "sanity");
return res;
}
void print_on_error(outputStream* st, const char* prefix) const;
// debugging
NOT_PRODUCT(bool covers(MemRegion rs) const;)
};
Le code vient de jdk8
给我你的怀抱2017-06-05 11:12:52
VALUE_OBJ_CLASS_SPEC
est une macro, définie dans globalDefinitions_sparcWorks.hppVALUE_OBJ_CLASS_SPEC
是一个宏,定义在globalDefinitions_sparcWorks.hpp里
#define VALUE_OBJ_CLASS_SPEC : public _ValueObj
#define VALUE_OBJ_CLASS_SPEC : public _ValueObj
réf1, réf2🎜
黄舟2017-06-05 11:12:52
VALUE_OBJ_CLASS_SPEC n'est pas un nom fatigué, sa fonction est de « décrire » la catégorie de définition de cette classe