Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Choosing Approach

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Индский дом    Конверсионные функции      Arithmetic Types    Buffer Types      Choosing Approach

Contents
Introduction
Choosing between conversion functions,
  buffer types, and arithmetic types
   Characteristics
      Endianness invariants
      Conversion explicitness
      Arithmetic operations
      Sizes
      Alignments
   Design patterns
      Convert only as needed (i.e. lazy)
      Convert in anticipation of need
      Generally as needed, locally in anticipation
   Use case examples
      Porting endian unaware codebase
      Porting endian aware codebase
      Reliability and arithmetic-speed
      Reliability and ease-of-use

Introduction

Решение о том, какой подход является лучшим эндоннесом (конверсия функций, типов буферов или арифметических типов) для конкретного приложения включает в себя сложные инженерные компромиссы. Трудно оценить эти компромиссы без некоторого понимания различных интерфейсов, поэтому вы можете прочитать функции конверсии, буферные типы и арифметические типы страниц перед тем, как погрузиться в эту страницу.

Choosing between conversion functions, buffer types, and arithmetic types

Лучший подход к кондиентности для конкретного применения зависит от взаимодействия между потребностями приложения и#39; и характеристиками каждого из трех подходов.

Рекомендация: Если вы новичок вэндианте, неопределенны или не хотите инвестировать время для изучения инженерных компромиссов, используйте эндианские арифметические типы. Они безопасны, просты в использовании и просты в обслуживании. Используйте , ожидая потребности шаблон дизайна локально вокруг горячих точек производительности, таких как длинные петли, если это необходимо.

Background

Работа с кондиентностью обычно подразумевает переносимость программы или требование переносимости данных, и часто оба. Это означает, что реальные программы, связанные с эндогенностью, обычно сложны, поэтому приведенные здесь примеры действительно будут написаны как несколько функций, распределенных по нескольким переводческим единицам. Они будут включать интерфейсы, которые не могут быть изменены, поскольку они поставляются третьими лицами или стандартной библиотекой.

Characteristics

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

Endianness invariants

Индские конверсионные функции используют объекты обычных арифметических типов C++, таких как int или неподписанный короткий для удержания значений. Это нарушает неявный инвариант, который применяются правила языка C++. Обычные языковые правила применяются только в том случае, если кондиентность объекта в настоящее время настроена на туземную кондиентность для платформы. Это может сделать очень трудно рассуждать о логическом потоке, и привести к трудному поиску ошибок.

Например:

struct data_t  // big endian
{
  int32_t   v1;  // description ...
  int32_t   v2;  // description ...
  ... additional character data members (i.e. non-endian)
  int32_t   v3;  // description ...
};
data_t data;
read(data);
big_to_native_inplace(data.v1);
big_to_native_inplace(data.v2);
... 
++v1;
third_party::func(data.v2);
... 
native_to_big_inplace(data.v1);
native_to_big_inplace(data.v2);
write(data);

Программист сделал' не потрудился конвертировать data.v3 в натуральную кондиансию, потому что этот член используется't. Более поздняя поддержка должна передавать data.v3 функции третьей стороны, поэтому добавляет Third_party::func(data.v3); где-то глубоко в коде. Это вызывает молчаливую неудачу, потому что обычный инвариант, что объект типа int32_t имеет значение, описанное основным языком C++, не применяется.

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

Вот тот же пример, с использованием эндонного арифметического типа:

struct data_t
{
  big_int32_t   v1;  // description ...
  big_int32_t   v2;  // description ...
  ... additional character data members (i.e. non-endian)
  big_int32_t   v3;  // description ...
};
data_t data;
read(data);
... 
++v1;
third_party::func(data.v2);
... 
write(data);

Более поздняя поддержка может добавить Third_party::func(data.v3) и будет просто работать.

Conversion explicitness

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

Индские арифметические типы выполняют конверсию косвенно. Это делает эти типы очень простыми в использовании, но может привести к ненужным преобразованиям. Неспособность оттачивать конверсии из внутренних петлей может привести к штрафу за производительность.

Arithmetic operations

Индские конверсионные функции не поставляют арифметические операции, но это не проблема, поскольку этот подход использует обычные арифметические типы C++ для удержания значений.

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

Endian арифметические типы обеспечивают арифметические операции. Их очень легко использовать, если задействовано много арифметики.

Sizes

Функции преобразования индейца только поддержка 1, 2, 4 и 8 байтовых целых чисел. Это' достаточно для многих приложений.

Индский буфер и арифметические типы поддержка 1, 2, 3, 4, 5, 6, 7 и 8 байтовых целых чисел. Для приложения, где использование памяти или скорость I/O является ограничивающим фактором, использование размеров, адаптированных к потребностям приложения может быть полезным.

Alignments

Функции преобразования индейца только поддержка выровнена целых типов и плавающих точек. Это' достаточно для большинства приложений.

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

Непортативный код вроде этого:

struct S { uint16_t a;  // большой кондиум uint32_t b;  // большой кондиян } __attribute__ ((упакованные));

Можно заменить таким переносным кодом:

struct S {
  big_uint16_ut a;
  big_uint32_ut b;
};

Design patterns

Приложения часто отображают конечные данные в виде записей или пакетов, содержащих несколько конечных элементов данных. Для простоты мы просто назовем их записями.

Если желаемая кондиентность отличается от родной кондиционности, то должна быть проведена конверсия. Когда такое преобразование должно произойти? Разработаны три модели дизайна.

Convert only as needed (i.e. lazy)

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

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

Convert in anticipation of need

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

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

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

Convert only as needed, except locally in anticipation of need

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

Пример:

struct data_t
{
  big_int32_t   v1;
  big_int32_t   v2;
  big_int32_t   v3;
};
data_t data;
read(data);
...
++v1;
...
int32_t v3_temp = data.v3;  // hoist conversion out of loop
for (int32_t i = 0; i < large-number; ++i)
{
  ... lengthy computation that accesses v3_temp many times ...
}
data.v3 = v3_temp; 
write(data);

In general the above pseudo-code leaves conversion up to the endian arithmetic type big_int32_t. But to avoid conversion inside the loop, a temporary is created before the loop is entered, and then used to set the new value of data.v3 after the loop is complete.

Question: Won't the compiler's optimizer hoist the conversion out of the loop anyhow?

Answer: VC++ 2015 Preview, and probably others, does not, even for a toy test program. Although the savings is small (two register bswap instructions), the cost might be significant if the loop is repeated enough times. On the other hand, the program may be so dominated by I/O time that even a lengthy loop will be immaterial.

Use case examples

Porting endian unaware codebase

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

The endian arithmetic approach is recommended to meet these needs. A relatively small number of header files dealing with binary I/O layouts need to change types. For example,  short or int16_t would change to big_int16_t. No changes are required for .cpp files.

Porting endian aware codebase

Существующая кодовая база работает на малоэндийских системах Linux. Он уже имеет дело с эндонностью через Linux предоставляет функции. Из-за слияния бизнеса, кодовая база должна быть быстро изменена для Windows и, возможно, других операционных систем, при этом все еще поддерживая Linux. Кодовая база надежна, и программисты хорошо осведомлены о конечных проблемах.

These factors all argue for an endian conversion approach that just mechanically changes the calls to htobe32, etc. to boost::endian::native_to_big, etc. and replaces <endian.h> with <boost/endian/conversion.hpp>.

Reliability and arithmetic-speed

Будет разработано новое, сложное, многослойное приложение, которое должно работать на маленьких эндорных машинах, но делать большую конечную сеть I/O. Разработчики считают, что вычислительная скорость для эндонной переменной является критической, но видели многочисленные ошибки, вызванные неспособностью рассуждать о состоянии конечного преобразования. Они также обеспокоены тем, что будущие изменения в обслуживании могут непреднамеренно ввести много медленных конверсий, если используются полноценные эндонные арифметические типы.

эндианский буфер подходит для заказа данного варианта использования.

Reliability and ease-of-use

Будет разработано новое, сложное, многослойное приложение, которое должно работать на маленьких эндорных машинах, но делать большую конечную сеть I/O. Разработчики считают, что вычислительная скорость для конечных переменных составляет не критична, но видели многочисленные ошибки, вызванные неспособностью рассуждать о состоянии конечного преобразования. Они также обеспокоены простотой использования как в процессе разработки, так и в процессе долгосрочного обслуживания.

Удаление беспокойства по поводу скорости преобразования и добавление беспокойства по поводу легкости использования советы баланса сильно в пользу эндианского арифметического подхода.


Последнее изменение: 19 января, 201519 January, 2015[ORIG_END] -->

© Copyright Beman Dawes, 2011, 2013, 2014

Distributed under the Boost Software License, Version 1.0. www.boost.org/ LICENSE_1_0.txt

 

Статья Choosing Approach раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:44:37/0.0052609443664551/1