C ++: как получить адрес указателя с плавающей точкой и преобразовать его в void ** - PullRequest
0 голосов
/ 27 октября 2018

В программировании на C ++ мне часто нужно получить адрес указателя и преобразовать его в void **.Например, обычно при использовании CUDA:

int main() {
    float *data;
    size_t size = sizeof(float) * 1024;

    CUDA_CHECK(cudaMalloc((void **)&data, size));   // question about this line
    ...
    CUDA_CHECK(cudaFree(static_cast<void *>(data)));

    return 0;
}

Моя проблема в том, что приведение типов float ** к void ** с использованием типа C раздражает меня, так как я не хочу использовать этов программировании на C ++.

До сих пор я использовал reinterpret_cast<void **>(&data), но я не доволен этим.По какой-то причине я не думаю, что это правильный способ сделать это.

Я пытался сделать &static_cast<void *>(data) один раз очень глупо, поскольку это явно не помогло при попытке получить адрес из значения.

Я провел некоторый поиск в Google и переполнении стека, но мне сложно найти хорошие ключевые слова для запроса.

Я также изучал концепцию ссылки на rvalue, но яне думаю, что он был разработан для этой проблемы.

Так что мой вопрос в том, что является правильным способом C ++ для преобразования из float ** в void ** в этом контексте?Кроме того, есть ли способ от static_cast до void * и по-прежнему получить адрес из возвращаемого значения, например, ссылку на rvalue?(PS: я до сих пор не совсем понимаю ссылку на rvalue, поэтому простите меня, если это ошибка новичка)

Редактировать --------------

Извините, я не прояснил себя.Я не хочу объявлять void * здесь.Я просто хочу как-нибудь сделать «правильный» приём C ++, чтобы выполнить это, желательно в одну строку.

Подробнее Редактировать ----------

Я понимаю, что использование void * является правильным способом, как @MM указал ниже (на самом деле, это именно то, что я делал в течение некоторого времени).Мне просто любопытно, есть ли какой-нибудь правильный способ избежать использования void *.

1 Ответ

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

Я бы сделал это следующим образом:

void *newdata;
CUDA_CHECK(cudaMalloc(&newdata, size));
float *data = static_cast<float *>(newdata);

CUDA_CHECK(cudaFree(data)); // or pass newdata, doesn't matter

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

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