Διορθώνει Visual C++ βελτιστοποίηση για Visual Studio 2015 συνάθροιση 3

Αυτό το άρθρο περιγράφει ένα πακέτο επείγουσας επιδιόρθωσης για το Microsoft Visual Studio 2015 ενημερωμένη έκδοση 3. Η επείγουσα επιδιόρθωση περιέχει αρκετές ενημερώσεις κώδικα για τη βελτιστοποίηση Visual C++ και η διαδικασία δημιουργίας κώδικα (c2.dll). Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα "ζητήματα που επιδιορθώνονται με αυτήν την επείγουσα επιδιόρθωση".

Προτεινόμενη αντιμετώπιση

Τρόπος απόκτησης αυτής της επείγουσας επιδιόρθωσης

Το ακόλουθο αρχείο είναι διαθέσιμο για λήψη από το Κέντρο λήψης της Microsoft:

Download Άμεση λήψη του πακέτου της επείγουσας επιδιόρθωσης.

Για περισσότερες πληροφορίες σχετικά με τον τρόπο λήψης αρχείων υποστήριξης της Microsoft, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής βάσης της Microsoft:

119591 Τρόπος απόκτησης αρχείων υποστήριξης της Microsoft από ηλεκτρονικές υπηρεσίεςΗ Microsoft εξέτασε αυτό το αρχείο για ιούς. Η Microsoft χρησιμοποίησε το πιο πρόσφατο λογισμικό εντοπισμού ιών που ήταν διαθέσιμο κατά την ημερομηνία που δημοσιεύτηκε το αρχείο. Το αρχείο είναι αποθηκευμένο σε διακομιστές με ενισχυμένη ασφάλεια, οι οποίοι συμβάλλουν στην αποτροπή μη εξουσιοδοτημένων αλλαγών στο αρχείο.

Προϋποθέσεις

Για να εφαρμόσετε αυτήν την επείγουσα επιδιόρθωση, πρέπει να έχετε το Visual Studio 2015 ενημερωμένη έκδοση 3 εγκατεστημένο.

Απαίτηση επανεκκίνησης

Ίσως χρειαστεί να κάνετε επανεκκίνηση του υπολογιστή μετά την εφαρμογή αυτής της επείγουσας επιδιόρθωσης, εάν χρησιμοποιείται καμία παρουσία του Visual Studio.

Πληροφορίες αντικατάστασης άμεσης επιδιόρθωσης

Αυτή η επείγουσα επιδιόρθωση δεν αντικαθιστά άλλες επείγουσες επιδιορθώσεις.

Θέματα που επιδιορθώνονται με αυτήν την επείγουσα επιδιόρθωση

Αυτή η επείγουσα επιδιόρθωση περιλαμβάνει ενημερώσεις κώδικα για τα ακόλουθα ζητήματα:

  • Επιδιορθώνει ένα σφάλμα στη τη βελτιστοποίηση κατά την ανύψωση ένα κατάστημα υπό όρους βρόχος παραλλαγή έξω από ένα βρόχο: #include <cstdlib> #include <cassert> struct Foo { int a; int b; }; int main() { Foo foo; foo.b = rand(); int a = rand(); int b = foo.b; for (int i = 0; i < 10; ++i) { int inner_b = b; int inner_a = a; if (inner_b < 0) // This gets incorrect hoisted outside the loop. // A workaround is /d2SSAOptimizer- { inner_a = 0; inner_b = 0; } if (inner_b >= 0) assert(inner_a == a); a += b; } return 0; }

     

  • Ενημέρωση κώδικα για ένα σφάλμα διαίρεσης ακέραιο στη τη βελτιστοποίηση: #include <stdio.h> volatile int z = 0; int main() { unsigned a, b; __int64 c; a = z; c = a; c = (c == 0) ? 1LL : c; b = (unsigned)((__int64)a * 100 / c); // Division was made unconditional // incorrectly creating a divide by zero. // A workaround is /d2SSAOptimizer- printf("%u\n", b); return 0; }

     

  • Ενημέρωση κώδικα για ένα σφάλμα διαίρεσης ακέραιο στη τη βελτιστοποίηση: int checkchecksum(int suly, int ell, int utkodert) { int x; ell -= utkodert; ell %= 103; if (suly - 1) utkodert /= (suly - 1); // Division was made unconditional, // incorrectly creating a potential divide by zero // A workaround is /d2SSAOptimizer- return utkodert; }

     

  • Ενημέρωση κώδικα για ένα σφάλμα διαίρεσης ακέραιο στη τη βελτιστοποίηση: typedef int unsigned uint; volatile uint out_index = 0; bool data[1] = {true}; bool __declspec(noinline) BugSSA(uint index) { uint group = index / 3; if (group == 0) // The division result being compared to zero is replaced // with a range check. We then incorrectly move the division { // to the next use of "group", without accounting for the fact // that "index" has changed. A workaround is /d2SSAOptimizer- return false; } index -= 3; group--; bool ret = data[group]; // crash here out_index = index; out_index = index; return ret; } int main() { volatile uint i = 3; return BugSSA(i); }

     

  • Διόρθωση για μια διακοπή λειτουργίας στη τη βελτιστοποίηση τη διαίρεση των MIN_INT με -1: int test_div(bool flag, int dummy) { int result = std::numeric_limits<int>::min(); int other; if (flag) other = -1; else other = dummy - 1 - dummy; result /= other; // We would push the division up into both arms of the // if-then-else. One of those divisions would cause the // optimizer to evaluate MIN_INT/-1.This is a crash, similar // to dividing by zero. A workaround is /d2SSAOptimizer- return result; }

     

  • Διορθώνει υπερχείλιση στοίβας κατά τη βελτιστοποίηση: #include <stdio.h> // This example produced a stack overflow in the optimizer, which was // caused by mutually-recursive analysis functions not properly tracking // the number of times they were invocated. // A workaround is /d2SSAOptimizer- typedef unsigned char byte; typedef unsigned long long int uint64; int main() { const uint64 *sieveData = new uint64[1024]; uint64 bitIndexShift = 0; uint64 curSieveChunk = 0xfafd7bbef7ffffffULL & ~uint64(3); const unsigned int *NumbersCoprimeToModulo = new unsigned int[16]; const unsigned int *PossiblePrimesForModuloPtr = NumbersCoprimeToModulo; while (!curSieveChunk) { curSieveChunk = *(sieveData++); const uint64 NewValues = (16 << 8) | (32 << 24); bitIndexShift = (NewValues >> (bitIndexShift + 8)) & 255; PossiblePrimesForModuloPtr = NumbersCoprimeToModulo + bitIndexShift; } if (PossiblePrimesForModuloPtr - NumbersCoprimeToModulo != 0) { printf("fail"); return 1; } printf("pass"); return 0; }

     

  • Διόρθωση για εσφαλμένη δημιουργία κώδικα όταν κατάργηση περιττών κινητής σημείο μετατροπές που αφορούν μετατρέψετε μια παράμετρος int32 f64: #include <string> __declspec(noinline) void test(int Val) { double Val2 = Val; std::string Str; printf("%lld\n", __int64(Val2)); // We incorrectly try to read 64 bits of // floating point from the parameter area, // instead of reading 32 bits of integer // and converting it. A workaround is // to throw /d2SSAOptimizer- } int main() { test(6); test(7); return 0; }

     

  • Διορθώνει μια αιφνίδια διακοπή λειτουργίας στη τη βελτιστοποίηση όταν διαίρεση κόμβους γράφημα ροής σε μια πρόταση προεπιλογή ενός μπλοκ διακόπτη, για περισσότερες λεπτομέρειες, ανατρέξτε στην ενότητα https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Επιδιορθώνει ένα σφάλμα στη τη βελτιστοποίηση βρόχο όταν εκτελούμε εσφαλμένη ισχύς μείωση χωρίς υπογραφή δευτερεύοντα διέγερσης μεταβλητών που είναι πολλαπλάσια της μεταβλητής πρωτεύοντα επαγωγής: #include <assert.h> #include <malloc.h> #include <stdio.h> typedef unsigned int uint; typedef unsigned char byte; /* There is a corner case in the compiler's loop optimizer. The corner case arose if an induction variable (IV) is a multiple of the loop index, and there's a comparison of the IV to an integer that is less than this multiplication factor. A workaround is to use #pragma optimize("", off) / #pragma optimize("", on) around the affected function. */ int main(int argc, char *argv[]) { const uint w = 256; const uint h = 64; const uint w_new = w >> 1; const uint h_new = h >> 1; const byte *const src = (byte *)malloc(w * h); byte *it_out = (byte *)malloc(w_new * h_new); int fail = 0; for (uint y_new = 0; y_new < h_new; ++y_new) { for (uint x_new = 0; x_new < w_new; ++x_new, ++it_out) { uint x = x_new * 2; uint y = y_new * 2; if (x < 1 || y < 1) { *it_out = 0; continue; } if (x != 0) { } else { fail = 1; } *it_out = 4 * src[y * w + x]; } } if (fail) { printf("fail\n"); return (1); } printf("pass\n"); return (0); }

     

  • Παρέχει έναν εναλλακτικό τρόπο αντιμετώπισης για C4883 ": μέγεθος συνάρτηση αποκρύπτει βελτιστοποιήσεις". Όταν η βελτιστοποίηση βλέπει τις λειτουργίες που είναι πολύ μεγάλη, αυτό θα κλίμακα πίσω τις βελτιστοποιήσεις που εκτελεί. Θα υποβάλει μια προειδοποίηση C4883 όταν συμβαίνει αυτό, εάν έχετε ενεργοποιήσει το προειδοποιητικό μήνυμα μέσω /we4883. Εάν θέλετε να παρακάμψετε αυτή απόφαση για να κάνετε απόκρυψη βελτιστοποιήσεις, Πετάξτε το διακόπτη /d2OptimizeHugeFunctions.

  • Διορθώνει για μια διακοπή λειτουργίας του προγράμματος μεταγλώττισης του γ2! PpCanPropagateForward κατά την εκτέλεση βελτιστοποιήσεις σε x64.

  • Επιδιορθώσεις για προβλήματα βελτιστοποίησης βρόχος που συνίσταται στην εσφαλμένη διέγερσης μεταβλητή ένταση μείωση.

  • Διορθώνει για εσφαλμένη αναπαραγγελίας παραστάσεων που συνίσταται στην ανάγνωση & γράφει στη μνήμη λόγω έλεγχος εσφαλμένα το ψευδώνυμο.

  • Διορθώνει για ένα σφάλμα εκχώρησης μητρώο που περιλαμβάνει μια που δημιουργείται από το μεταγλωττιστή προσωρινά υπάρχει σε πολλές χειρισμού περιοχές εξαίρεσης.

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα των προϊόντων της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".

Χρειάζεστε περισσότερη βοήθεια;

Αναπτύξτε τις δεξιότητές σας
Εξερευνήστε το περιεχόμενο της εκπαίδευσης
Αποκτήστε πρώτοι τις νέες δυνατότητες
Συμμετοχή στο Microsoft Insider

Σας βοήθησαν αυτές οι πληροφορίες;

Σας ευχαριστούμε για τα σχόλιά σας!

Σας ευχαριστούμε για τα σχόλιά σας! Φαίνεται ότι μπορεί να είναι χρήσιμο να συνδεθείτε με έναν από τους συνεργάτες υποστήριξης του Office.

×