2015-03-26 4 views
-1

Я пытаюсь использовать в стеке буфер char в качестве хранилища для некоторых других типов данных.invalid cast from char * to int *

В качестве теста я начал с самого простого int, но указатель на литье символов в указатель целого не компилируется.

char buf[256]; 
int* l = static_cast<int*>(buf); 
*l = 20; 

ошибки я получил это

error: invalid static_cast from type ‘char*’ to type ‘int*’ 

Будучи этими примитивными данными, которые я ожидал, чтобы это работало: вы знаете, что механики позади этого конкретного случая?

Я выяснил, используя reinterpet_cast, но я бы хотел использовать static_cast, поскольку это последнее должно быть быстрее.

+1

Почему, по вашему мнению, static_cast быстрее, чем reinterpret_cast для указателей? –

+0

'int l = static_cast ('c');' будет работать, но не для указателей. –

+0

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

ответ

2

Вам понадобится реинтерпрет. Вот как это работает с правильным выравниванием:

#include <memory> 

std::aligned_storage<20 * sizeof(int), alignof(int)>::type storage; 

int * p = reinterpret_cast<int *>(&storage); 

for (std::size_t i = 0; i != 20; ++i) 
{ 
    ::new (p + i) int(i); // or "p[i] = i;" 
} 
+0

В чем причина ':: new'? –

+0

@NeilKirk: Это вообще. –

+0

На самом деле, если вы используете массив для хранения и продолжаете использовать place-new, вам не нужны какие-либо приведения, как в [этом примере] (http://en.cppreference.com/w/cpp/types/aligned_storage) (поскольку place-new принимает указатель void, и любой указатель объекта может быть неявно преобразован в указатель void). –

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

  • Нет связанных вопросов^_^