Структура пакета пакета OSGi

Оператор выражения

                    *(long long *)grp = 0;

имеет неопределенное поведение из-за доступа к объекту типа int[4] через lvalue другого несовместимого типа (long long) - - нарушение строгого алиасинга, как вы видите в вопросе. Но это не должно быть ограничено поведением во время выполнения . (Потенциальная) проблема, видимая во время трансляции, поведение во время трансляции также не определено, и поэтому таков результат каждого выполнения.

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

Что касается обновления

Ваш пример (4) имеет совершенно четкое поведение. Основными соображениями здесь являются

  • Явно разрешено преобразовывать значение одного типа указателя объекта в другой тип указателя объекта. Существуют предостережения по поводу выравнивания результата, но C требует, чтобы он всегда работал для преобразования в char *, и требует обратного преобразования, чтобы воспроизвести исходное значение указателя (которое не имеет проблемы с выравниванием, если оно действительно с самого начала). [+1121]

  • Разрешается доступ к представлению любого объекта через lvalue символьного типа. Другими словами, char * разрешено создавать псевдоним любой части любого объекта, поэтому даже если вы не не обращаетесь к чему-либо напрямую через значения char *, переданные в assign(), соответствующий компилятор должен Предположим, что эти указатели могут иметь псевдоним любого объекта в программе.

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

  • Используя аргумент type для функции assign() способом, согласующимся с реализацией этой функции, программа гарантирует, что к каждому задействованному объекту в конечном итоге получают доступ (только) через lvalue его правильного типа. [ тысячу сто двадцать четыре]

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

7
задан TRiG 12 September 2013 в 09:49
поделиться

3 ответа

Вы могли бы также рассмотреть помещение интерфейсов в com.company_name.subsystem, и реализация в com.company_name.subsystem.impl, определенный код OSGI, если существует кто-либо, мог бы быть в com.company_name.subsystem.osgi. Когда-то у Вас могли бы быть несколько реализация тех же интерфейсов. В этом случае Вы могли рассмотреть - com.company_name.subsystem.impl1 и com.company_name.subsystem.impl2, например:

com.company.scm        // the scm api
com.company.scm.git    // its git implementaton
com.company.scm.svn    // its subversion implementation
com.company.scm.osgi   // the place to put an OSGI Activator

В этом смысле структура пакета могла быть агностиком OSGi, если Вы позже перемещаетесь в другой контейнер, Вы просто помещаете дополнительное

com.company.scm.sca     // or whatever component model you might think of

Всегда наличие api и impl в Вашем пакете имя могло быть раздражающим. Если в использовании сомнения impl но нет api.

6
ответ дан 7 December 2019 в 05:30
поделиться

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

0
ответ дан 7 December 2019 в 05:30
поделиться

Это не количество классов, которое важно, но понятия. По-моему, у Вас должен быть один концептуальный объект в пакете. В некоторых случаях это могло бы быть всего несколькими классами в других нескольких пакетах с 100 с классов.

Чем важный случается так разделением API и реализации. Один пакет содержит API Вашего понятия и другого реализация. Как это можно обеспечить различные реализации для четко определенного API. В некоторых случаях это могло бы быть даже необходимо, если Вы хотите получить доступ к сервисам от пакета удаленно (использование, например, R-OGSi)

Пакеты API затем используются совместным использованием кода и услугами от пакетов реализации сервисным совместным использованием. Лучший способ исследовать те возможности состоит в том, чтобы посмотреть на ServiceTrackers.

2
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: