Компиляторы и порядок аргументов оценки в C++

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

javax.validation.constraints.@NotNull - это проверка JSR, поэтому она должна охватываться вышеуказанным ответом. Если нет, возможно, вы можете попытаться прокомментировать этот ответ.

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

Вы должны понимать, что это конкретное поведение, перечисленное в ответе выше, очень специфично для процессоров аннотаций проверки бобов & amp; не имеет ничего общего с общим наследованием аннотаций в Java.

Просто не по теме, но пытаюсь включить эти ответы, чтобы понять Наследование аннотаций в Java,

Ответ -1

Ответ -2 [ 117]

Ответ -3

Ответ -4 Spring MVC Validations

Просто для иллюстрации, нет сообщений об ошибках до строки - Bar bar = foo.getBar();, но когда я провожу его через валидатор, я получаю сообщение - bar- may not be null для обоих родителей & amp; ребенок,

@java.lang.FunctionalInterface
public interface FooChild extends Foo {

}

и программа водителя,

    import java.util.Set;

    import javax.validation.Configuration;
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;

    public class DriverProgram {

        public static void main(String[] args) {
        Foo foo = () -> {
            return null;
        };

        Bar bar = foo.getBar();

        Configuration config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();

        Set> violations = validator.validate(foo);
        violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));
FooChild fooChild = () -> {
        return null;
    };

    bar = fooChild.getBar();

    violations = validator.validate(fooChild);
    violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));


        }

    }

59
задан sepp2k 8 March 2019 в 20:47
поделиться

4 ответа

Это зависит от типа аргумента, соглашения о вызовах вызванной функции, archtecture и компилятора. На x86 Паскаль соглашение о вызовах оценивает аргументы слева направо, тогда как в соглашении о вызовах C ( __ cdecl) это справа налево. Большинство программ, которые работают на нескольких платформах, действительно принимает во внимание соглашения о вызовах пропустить неожиданности.

существует хорошее статья о Raymond Chen' блог, если Вам интересно. Можно также хотеть смотреть на раздел Stack и Calling руководства GCC.

Редактирование: , Пока мы крохоборствуем: Мой ответ рассматривает это не как вопрос о языке, но как платформа один. Стандарт языка не делает gurantee или предпочитает один по другой и оставляет его как [1 110] неуказанным . Отметьте формулировку. Это не говорит, что это не определено. Неуказанный в этом смысле означает что-то, на что Вы не можете рассчитывать, непортативное поведение. У меня нет спецификации/проекта C удобной, но это должно быть подобно этому из моего проекта n2798 (C++)

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

53
ответ дан dirkgently 24 November 2019 в 18:31
поделиться

Read это

Это не точная копия Вашего вопроса, но мой ответ (и немногие другие) покрывают Ваш вопрос также.

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

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

И да, я видел, что несколько версий GCC делают точно это. Для Вашего примера назвали бы нечто (0,0), и я буду 2 впоследствии. (Я не могу дать Вам точный номер версии компилятора. Это было только что - но я не буду удивлен видеть, что это поведение открывается снова. Это - эффективный способ запланировать инструкции)

6
ответ дан Community 24 November 2019 в 18:31
поделиться

В прошлый раз, когда я видел, различия были между VS2005 и GCC 3.x на x86 аппаратных средствах в 2007. Таким образом, это (был?) вероятная ситуация. Таким образом, я никогда не полагаюсь на порядок оценки больше. Возможно, это лучше теперь.

2
ответ дан Robert Gould 24 November 2019 в 18:31
поделиться

Я ожидаю, что самые современные компиляторы попытались бы чередовать инструкции, вычислив аргументы, учитывая, что они требуются стандартом C++ быть независимыми и таким образом испытать недостаток в любых взаимозависимостях. Выполнение этого должно помочь сохранить модули выполнения глубоко конвейерного ЦП полными и таким образом увеличить пропускную способность. (По крайней мере, я ожидал бы, что компилятор, который утверждает, что был оптимизирующим компилятором, сделал бы так, когда флаги оптимизации даны.)

2
ответ дан j_random_hacker 24 November 2019 в 18:31
поделиться
Другие вопросы по тегам:

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