pstr_t *pstring_t<F>::salloc(int n) { if (stk == nullptr) stk = palloc_array(std::stack<pstr_t *>, 17); pstr_t *p; unsigned sn= ((32 - countleadbits(n)) + 1) / 2; unsigned size = sizeof(pstr_t) + ((UINT64) 1<<(sn * 2)) + 1; if (stk[sn].empty()) p = (pstr_t *) palloc_array(char, size); else {
void pstring_t<F>::sfree(pstr_t *s) { s->m_ref_count--; if (s->m_ref_count == 0 && s != &m_zero) { if (stk != nullptr) { unsigned sn= ((32 - countleadbits(s->len())) + 1) / 2; stk[sn].push(s); } else pfree_array(((char *)s)); //_mm_free(((char *)s)); } }
void pstring_t<F>::sfree(pstr_t *s) { if (s != nullptr) { bool b = s->dec_and_check(); if ( b && s != &m_zero) { if (stk != nullptr) { size_type sn= ((32 - countleadbits(s->len())) + 1) / 2; stk[sn].push(s); } else plib::pfree_array(reinterpret_cast<char *>(s)); } } }
pstr_t *pstring_t<F>::salloc(std::size_t n) { if (stk == nullptr) stk = plib::palloc_array<std::stack<pstr_t *>>(17); pstr_t *p; std::size_t sn= ((32 - countleadbits(n)) + 1) / 2; std::size_t size = sizeof(pstr_t) + (static_cast<std::size_t>(1)<<(sn * 2)) + 1; if (stk[sn].empty()) p = reinterpret_cast<pstr_t *>(plib::palloc_array<char>(size)); else { p = stk[sn].top(); stk[sn].pop(); } // str_t *p = (str_t *) mm_malloc(size, 8); p->init(n); return p; }