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

Безопасно ли читать многомерный массив или вектор через указатель?

void playWithThePixels(void* p, int depth, int pitch, int width, int height);

typedef unsigned char Pixel[4];
std::vector<Pixel[1600]> screen(900);
playWithThePixels(screen.data(), 32, 1600, 1600, 900);
return 0;

И элементы массива C, и std::vector гарантированно будут непрерывными, поэтому screen должны располагаться в памяти непрерывно.

Я знаю, что доступ к элементам массива за пределами границ является поведением undefined, но как насчет чтения по указателю, например, в примере кода?

Или что, если вы сделаете

std::cout << screen[0][10000][0];

? Это определенное поведение? Я, очевидно, получаю доступ к выделенной области.

Имеет ли значение чтение элементов массива, прямо или косвенно через указатель?


  • Программа имеет неправильный формат: параметр типа vector не должен быть типом массива (например, из-за требований распределителя). 06.07.2015
  • @KerrekSB Хорошо, тогда позвольте мне поменять вектор на std::array или простой массив или указатель на массив. 06.07.2015
  • Общие правила таковы: 1) Не обращайтесь к массивам за пределами границ. 2) Никаких каламбуров. По сути, то, о чем вы думаете, недопустимо. 06.07.2015
  • Я очень хочу закрыть это как обман Одномерный доступ к многомерному массиву: четко определенный C? но люди не заметят разницы в тегах; однако в этом контексте языки требуют одинакового поведения. 06.07.2015

Ответы:


1

Да, это должно работать. По той лишь причине, что размер Pixel[1600] будет соответствовать условиям выравнивания для большинства архитектур ЦП.

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

Например, в вашем случае расчет индекса будет следующим:

int pixelIdx = column + row * rowSize;

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

06.07.2015
  • Это не правильно. Есть только один vector, вы, кажется, спорите с vector<vector<…>>. На практике пример OP будет работать (по крайней мере, с использованием std::array), но он нарушает строгие правила стандарта. 06.07.2015
  • Ты абсолютно прав. Я собираюсь обновить свой пост. Спасибо за подсказку. 06.07.2015
  • Новые материалы

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

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

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

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

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

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

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