2015-06-16 2 views
0

У меня есть символ * данные, которые я с приведением для того, чтобы получить к нему доступ, как этотКак передать массив переменного размера указателей в качестве аргумента функции

arr[2][3] 

Я продолжил тот путь:

char (*arr)[size] = (char (*)[size])data; 

Моя проблема в том, как передать «arr» в качестве аргумента функции?

void func(??? arr) 
{ 
    ... 
} 

void test(char *data, int size) 
{ 
    char (*arr)[size] = (char (*)[size])data; 
    func(arr); 
} 

Я не знаю значения «размер» во время компиляции.

Кроме того, я знаю, что могу просто получить доступ к моему значению следующим образом: data [2 * size + 3], но мне нужно избегать умножений для ограничений скорости.

+0

Просто 'void func (char ** arr)' – 101010

+2

VLA, такой как 'char (* arr) [size]' не является стандартным C++. Во всяком случае, вы не можете использовать 'data' для такого типа, так же, как вы не можете использовать' apple' в 'orange'. Это не имеет смысла. – Nawaz

+7

* «но мне нужно избегать умножений для ограничения скорости» * - как вы думаете, что компилятор будет иметь отношение к индексам в 'arr [x] [y]', если вы дадите ему знание размеров массива? –

ответ

1

Кроме того, я знаю, что могу просто получить доступ к моему значению следующим образом: data [2 * size + 3], но мне нужно избегать умножения ограничений скорости.

Этого нельзя избежать в том виде, в котором вы предлагали. Если вы получаете доступ к данным вроде x[2][3], что вы ожидаете от компилятора? Он преобразует индексирование в эквивалент 2 * size + 3. Если это слишком медленно для вашей проблемы, вам не повезло и нужно найти другой способ выиграть время. Предлагаемое решение, которое вы не можете сделать, не является решением, поэтому бессмысленно даже попробовать его.

Возможно, вы можете изменить свой код, чтобы использовать другой шаблон доступа, без большого количества сложных прыжков, которые требуют всех этих умножений? Линейные обращения к памяти, как правило, являются лучшими, потому что они используют иерархию памяти; возможно, вы можете просто воспользоваться этим? Трудно сказать, что вы можете изменить, даже не зная, что делает код.

+0

Я декомпилировал для сравнения, и да, вы правы, компилятор размножается. Поэтому я вернулся к версии для умножения, но все еще медленнее. Тогда я полагаю, что компилятор все равно что-то оптимизирует. спасибо за помощь – Olivier

1

У меня есть символ * данные, которые я с приведением для того, чтобы получить к нему доступ, как этот

И это источник ваших проблем. Это смежный блок памяти. Напишите фасад вида, если вам нужен другой интерфейс, или ...

Моя проблема в том, как передать «arr» в качестве аргумента функции?

Самый простой способ избежать использования (ужасных) примитивов низкого уровня, оставшихся на языке для совместимости с C.

Если вы не знаете размер во время компиляции, используйте std::vector. Если вы знаете, используйте std::array.

, но мне нужно избегать умножения ограничений скорости.

Если у вас нет контрольных данных, чтобы поддержать это, я отклоняю это требование как преждевременную оптимизацию.

+0

Это опять-таки ограничение скорости, которое делает меня кодом типа C. Я не ищу самый простой способ. Я занимаюсь обработкой изображений в реальном времени, и мне нужно получить доступ к десяткам миллионов данных за несколько миллисекунд. Использование std: vector значительно замедляет работу программы. Избегайте множителей, которые я обнаружил, заставляя меня экономить много времени на протяжении всего процесса. Мне просто нужно разделить мою программу на разные функции, потому что это невозможно прочитать. – Olivier

+0

* Использование std: vector значительно замедляет работу программы. * - ** ** **. Результаты тестов. Код, который использовал 'std :: vector'. Все. –

+0

@Olivier $ 10 говорит, что вы забыли позвонить «резерв». – Shoe

Смежные вопросы