Лучший способ выделить память для гибкости и управления - PullRequest
0 голосов
/ 13 октября 2018

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

Colleague1:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;

char* colleague1_way() //just allocate when he wants
{
char* mem = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
return mem;
}

int main(void)
{ 
    char* data;

    data=colleague1_way();
    function1(data); //pass by pointer
    function2(data); //pass by pointer
    function3(data); //pass by pointer

    free(data);
}

Colleague2:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;
char* data;    //set it as global memory

void colleague2_way()
{
data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
}

int main(void)
{
    colleague2_way();

    function1(); //void input, proceed data inside function
    function2(); //void input, proceed data inside function
    function3(); //void input, proceed data inside function

    free(data);        
}

Me:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;

int main(void)
{
    char* data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);

    function1(data); //pass by reference 
    function2(data); //pass by reference
    function3(data); //pass by reference

    free(data);        
}

Моя идея

  1. Я мог четко видеть выделенную память и освобождать ее в конце main ().
  2. function1 ~ 3 может быть в другом cppфайл, так что легко обрабатывать.

Кто-нибудь может дать мне комментарий, и есть ли лучший способ?Кроме того, если это на C ++, есть ли хорошие способы?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Сначала поговорим о способе "Colleague2": char указатель data, объявленный глобально

Вы должны избегать объявления переменных глобально, пока они действительно не понадобятся.Здесь я не вижу никакой причины объявлять указатель data глобально.Поскольку он виден другим функциям, его область действия увеличивается и может быть случайно изменена другой частью кода, что нежелательно.

«Colleague1» и «Me»:
В обоих этих случаях одинХорошо, что область действия указателя data ограничена.Но в «Colleague1» операция выделения памяти является частью другой функции, что на самом деле хорошо, потому что вы можете выполнять обработку ошибок выделения памяти в одном месте (что отсутствует во всех 3 способах) .Рассмотрим случай, когда вам нужно выделить такой же объем памяти в какой-то другой части кода, тогда вам просто нужно вызвать эту функцию вместо того, чтобы снова делать malloc.Если вы уверены, что вам не нужно будет выделять тот же размер памяти снова, то в этом случае «Я» тоже подойдет.Таким образом, из этих двух способов следуйте по любому подходящему пути, но обязательно выполняйте необходимую обработку ошибок.

0 голосов
/ 13 октября 2018

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

#define IMAGE_WIDTH 1280
#define IMAGE_HEIGHT 800
#define PIXEL_DEPTH 2

int main(void)
{
    char data[IMAGE_WIDTH][IMAGE_HEIGHT][PIXEL_DEPTH] = {0};

    function1(data); //pass by reference 
    function2(data); //pass by reference
    function3(data); //pass by reference

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...