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

Я знаю способ неметапрограммирования, чтобы решить, является ли ПК прямым порядком байтов или нет.

eg:

#include <iostream>
#include <stdint.h>

union A { 
    uint16_t v;
    char c[2];
};  

int main(void) {
    A a;
    a.v = 0x0102;
    std::cout << (a.c[0] == 0x01 ? "big endian" : "little endian") << std::endl;

    return 0;
}

Но, это дорого во время выполнения, не так ли?

Итак, есть ли способ решить, является ли ПК прямым порядком байтов или нет с помощью метапрограммирования?

Спасибо!


person 大宝剑    schedule 27.09.2012    source источник
comment
Зависит от вашего конкретного компилятора — посмотрите здесь некоторые подробности: gcc.gnu.org/ml/gcc-help/2007-07/msg00342.html   -  person michel-slm    schedule 27.09.2012
comment
Уже задан вопрос stackoverflow.com/questions/8571089/   -  person AnthonyFG    schedule 27.09.2012
comment
@AnthonyFG Нет, эта проблема не решается метапрограммированием.   -  person 大宝剑    schedule 27.09.2012
comment
Что вы имеете в виду под дорогим? Время? Сложность? Объем памяти? Вы измерили? Самое дорогое что я вижу в вашем примере кода это вывод, все остальное мелко, быстро и тривиально.   -  person Some programmer dude    schedule 27.09.2012
comment
См. stackoverflow.com/questions/2100331/ @ Norman Ramsey   -  person Mikhail    schedule 27.09.2012
comment
@JoachimPileborg Извините, я описал недостаточно подробно. дорого значит время и память. Если мы можем определить порядок байтов во время компиляции, зачем мы вызываем функцию во время выполнения, чтобы решить это? Он будет использовать цикл ЦП. и память. Поэтому я думаю, что получить ответ во время компиляции лучше, чем во время выполнения.   -  person 大宝剑    schedule 27.09.2012
comment
На современном ЦП класса ПК фактическая проверка будет занимать менее миллисекунды и вряд ли превысит 32 байта (включая данные и инструкции), и ее нужно выполнить только один раз. Если ваша программа очень невелика, это, скорее всего, будет составлять менее 0,01 процента как процессорного времени, так и требований к памяти. Вы должны программировать для чрезвычайно систем, чтобы это считалось проблемой, и в этих случаях вы уже знаете порядок байтов и заранее подстроитесь под него.   -  person Some programmer dude    schedule 27.09.2012
comment
Кроме того, если вы сделаете это во время компиляции, вы не сможете использовать программу при кросс-компиляции для цели с другим порядком байтов, чем хост.   -  person Some programmer dude    schedule 27.09.2012


Ответы (1)


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

Метапрограмма шаблона не может ничего знать об этом.

person n. 1.8e9-where's-my-share m.    schedule 13.10.2012