2012-03-14 2 views
0

Если предположить, что мы имеем 32bit целого числа, 8bit полукокс, GCC компилятор и Intel архитектуру:C++: самый быстрый способ получить доступ к конкретному октету Int

Что будет самым быстрым способом (без использования ассемблера) для извлечения, скажем, третий октет целочисленной переменной? Например, чтобы сохранить его в символе определенного места char []?

+2

Не обращайте внимания на «самый быстрый»; вы знаете, как это сделать вообще? Затем сделайте это, пусть компилятор оптимизирует его. –

+2

Использовать наиболее очевидный способ и позволить компилятору преобразовать его в нечто более эффективное? Например. '(Some_integer >> 16) & 0xff'. –

+2

Почему вы считаете, что вам нужен самый быстрый способ для такой операции? У вас есть узкое место в производительности именно в этой операции? Есть ли смысл делать ничего, кроме очевидного? –

ответ

3

использовать Union:

union myCharredInt 
{ 
    int myInt; 
    struct { 
     char char1; 
     char char2; 
     char char3; 
     char char4; 
    } 
}; 

myCharredInt a = 5; 

char c = a.char3; 
+0

Вы правы, и это можно решить с помощью анонимной структуры. –

+3

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

+0

Анонимные структуры - это расширение Microsoft. Действительно ли поддерживает GCC? Также использование соединений таким образом в C++ является неопределенным поведением. – bames53

6

Для 3 октета (маленький обратный порядок байт):

int i = 0xdeadbeef; 
char c = (char) (i>>16); // c = 0xad 
0

сдвиг октет в младшем октета и хранить его

несколько, как это, но это зависит именно то, что вы имеете в виду 3 октета, а большинство из моего опыта была в большой Endian архитектуры

char *ptr; 
.... 
*ptr = val >> 8; 
+0

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

+2

@ AndréCaron: С точки зрения вопроса, я считаю, что обратное верно: если вы напрямую обращаетесь к байтам, то «третий октет» всегда является третьим байтом, но если вы используете бит-сдвиги, то вам нужно знать, является ли третий октет вторым по значимости (как и для малоэтажной архитектуры) или третьим по значимости (как и в случае с большим эндиантом). – ruakh

0

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

Хотя существуют правила большого пальца, чтобы следовать, они не будут окончательно дать вам лучший ответ для вашей конкретной системы, архитектуры, компилятора и т.д.

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

Как вы узнаете, что лучше?

Ответ: Попробуйте их. Профилируйте их.

N.b .: Я немного увлекаюсь. Я подозреваю, что вы действительно хотите знать, как это сделать вообще, а не как сделать это быстрее всего.

+0

Как я могу описать то, о чем я даже не знаю? Как бы я сравнил скорость «профсоюзного трюка» против «смены и маски», если я даже не знаю, что первое существует? Почему я должен задать вопрос, что-то, что я не имею в виду? Реакция вашего и многих других в этой теме бессмысленно агрессивна и невежественна, что удивляет, увидев в SO. – izhak

+0

@izhak: это поведение является ответом на два феномена: 1) слишком много программистов, озабоченных микро-оптимизацией; и 2) так много * на самом деле необоснованных * вопросов об оптимизации на SO. Если вы не описываете конкретный сценарий, в котором это необходимо (например, «Я пишу видеокодек и запускаю этот материал 10^6 раз в секунду в узкой петле ...») и любые решения, которые вы придумали до сих пор , то нет реального ответа на вопрос. Реальный ответ зависит от вашего компилятора и аппаратного обеспечения, и нам нечего сравнивать. –

+0

@izhak: Есть вопрос, на который я хотел бы ссылаться, например, но я больше не могу его найти. –

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