2015-09-23 11 views
1

В настоящее время я это происходит:Создать зЬй :: строку с фиксированным адресом данных

struct HashItem { 
    uint32_t Value; 
    char Key; 

    uint32_t GetSize() { 
     return 4 + GetKey().size(); 
    } 

    void SetKey(std::string &Key) { 
     memcpy(&(this->Key), Key.c_str(), Key.size()); 
    } 
    std::string GetKey() { 
     return std::string(&Key); 
    } 

    static HashItem* Cast(void* p) { 
     return reinterpret_cast<HashItem*>(p); 
    } 
}; 

Это структура предназначается, чтобы быть интерпретация местоположения указателя в ММФ. В начале этого, у меня есть хеш-таблица и сразу после того, как это те HashItems в серии. Мне было интересно, хотя если бы можно было создать std :: string с фиксированным char * (указывая на то, где в данный момент находится ключ ключа), где он хранит фактические данные?

Эта память управляется вручную в любом случае, и поле string, а не поле char будет более удобным.

+0

'std :: string' может быть гораздо больше, чем константный строковый литерал, поэтому в целом ответ отрицательный. Почему бы не использовать указатель, в котором должен быть указатель? Если вам нужно на самом деле создавать струнные элементы на вашем ключе (например, сравнение), вам придется реализовать их самостоятельно (т. Е. Использовать стандартную библиотеку для строк C), но вы также избегаете накладных расходов. – BeyelerStudios

+0

Есть опечатка, или 'Key' - это всего лишь один символ? –

+0

@SergeBallesta Его заполнитель для извлечения указателя только – user81993

ответ

1

... если бы можно было создать std :: string с фиксированным символом char * (указывая на то, где в данный момент находится символ ключа), где он хранит фактические данные?

Не очень - std :: строка явно и очень четко управляет собственной памятью. Вы могли бы взломать его с помощью специального распределителя, но я склонен думать, что это будет ужасно.

Если вы просто хотите что-то вроде std::string (т.е. имеющие одни и те же операторы и открытый интерфейс), но не владеющим своей собственной памяти, просто используйте Boost.String_Ref, который делает то, что вы (кажется,) хотят без хаков.

1

Нет, это невозможно.
Кроме того, когда вы возвращаете std::string в GetKey(), вы фактически копируете строку. std::string всегда управляет собственной памятью. Одна из веских причин этого заключается в том, что указатель может меняться без предупреждения, и вы никогда не сможете опираться на то, где он находится.
В большинстве реализаций std::string есть «короткая оптимизация строк», где для строк короче 16 символов память на самом деле находится там внутри строкового объекта в виде массива. для чего-либо дольше выделяется память. Этот тип инварианта (если указатель len < 16 указатель A else является B) не может поддерживаться, если указатель может поступать извне.