Nano Hash - криптовалюты, майнинг, программирование

Будут ли выделения с коротким временем жизни вызывать фрагментацию кучи?

Предположим, у меня есть следующее:

std::string TestFragmentation()
{
    std::vector<char> buffer(500);
    SomeCApiFunction( &buffer[0], buffer.size() ); // Sets buffer to null-terminated string data
    return &buffer[0];
}

Будет ли приведенный выше вектор, который выделяет память в куче, причиной фрагментации памяти? Мое понимание фрагментации таково, что это действительно происходит только в том случае, если у вас есть небольшие долгоживущие выделения между более крупными, более короткоживущими выделениями (или наоборот).

Я не хочу преждевременно оптимизировать эту ситуацию, поэтому я хотел бы услышать общее мнение о таком коде. Я знаю, что различные эксперты не рекомендуют размещать в стеке большие буферы (в конце концов, для этого и нужна куча), так что обычно я думаю об этом в первую очередь, когда пишу подобный код. Фрагментация обычно требует анализа. Каким должно быть мое душевное состояние здесь?


  • Я бы не считал 500 байт большим буфером. 17.04.2012
  • Это полностью определяется реализацией, поскольку зависит от поведения распределителя по умолчанию вашей стандартной библиотеки. 17.04.2012
  • @ildjarn Я полагаю, мы должны придерживаться какой-то простой реализации для целей этого вопроса. Технически говоря, вы правы, но я ищу здесь общую перспективу. 17.04.2012
  • ТБХ, я на самом деле не уверен, что здесь происходит. Векторный класс представляет собой обернутый динамический массив с внутренними метаданными, функция объявляет, что возвращает std::string, но вместо этого возвращает указатель на данные, принадлежащие вектору, который вот-вот будет уничтожен? Я правильно понимаю? Я не понимаю и не следую такому коду - мне трудно понять, что во что копируется и что будет уничтожено, когда :( Я бы обновил () вектор и вернул его указатель как *vector‹char ›. 17.04.2012
  • @MartinJames, он основан на неявном преобразовании из char * в std::string, как и return "answer";. std::vector делает очень хороший интеллектуальный указатель для буфера. 17.04.2012
  • @MartinJames Возвращает строку, потому что функция говорит, что возвращает строку. Это то же самое, что и return std::string(&buffer[0]);. Строка должна быть создана, пока buffer все еще находится в области действия, потому что она ссылается на buffer, а вы не можете ссылаться на имя, которое находится вне области действия. Так что нет проблем. 17.04.2012

Ответы:


1

Если это наиболее естественный способ выразить то, что делает этот код, то вы должны сделать это таким образом. Если у вас нет очень необычной ситуации, о которой вы нам не сказали, фрагментация памяти еще не должна быть на вашем экране радара.

16.04.2012
  • Спасибо. Не могли бы вы привести несколько примеров того, когда фрагментация памяти была бы на моем экране радара? 17.04.2012
  • Когда вы действительно видите, что выделение памяти не выполняется, и исключаете утечку ресурсов. Когда вы на самом деле разрабатываете код управления памятью. Когда вы имеете дело со специализированными средами, отличными от вычислений общего назначения, такими как встроенные системы. Когда вы имеете дело с особыми видами памяти (например, с приложениями в ядре с ограниченным объемом памяти на специализированном оборудовании или с заблокированной памятью для Windows, перекрывающиеся операции в более старых версиях Windows). 17.04.2012
  • Спасибо, Дэвид, отличные моменты. В конце концов, однако, я выбрал boost::array, потому что для такой простой задачи я не хотел, чтобы работа через диспетчер памяти влияла на производительность. 17.04.2012
  • Это нормально. Я не думаю, что это будет иметь какое-то значение, но если код читается так же естественно в любом случае, то никакого вреда не будет. Но не извращайте свой код, чтобы избежать выделения памяти. Современные распределители работают быстро, а чистый код, который легко понять, отлаживать и поддерживать, значителен. 17.04.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..