Truyền các loại hoặc cấu trúc được căn chỉnh với các loại căn chỉnh theo giá trị không hoạt động với một số triển khai. Điều này phá vỡ các container STL, bởi vì một số phương thức (chẳng hạn như thay đổi kích thước) lấy đối số của chúng theo giá trị.Các loại được sắp xếp và đối số truyền theo giá trị
Tôi chạy một số thử nghiệm với Visual Studio 2008 và không hoàn toàn chắc chắn khi nào và cách vượt qua bởi giá trị không thành công. Mối quan tâm chính của tôi là chức năng foo. Nó có vẻ hoạt động tốt, nhưng nó có thể là kết quả của nội tuyến hoặc một số trùng hợp ngẫu nhiên khác không? Nếu tôi đổi chữ ký thành void foo (const __m128 &)?
Thông tin đầu vào của bạn được đánh giá cao. Cảm ơn bạn.
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
EDIT. STL thất bại ngay cả với phân bổ liên kết, bởi vì vượt qua bởi vấn đề giá trị vẫn còn.
Tìm thấy liên kết này pass __m128 by value
Lỗi biên dịch/cảnh báo bạn nhận được là gì? Tôi giả định một cái gì đó như "thông số chính thức ... sẽ không được liên kết"? – celion
Đây là những gì tôi nhận được. lỗi C2719: 'unnamed-parameter': tham số chính thức với __declspec (align ('16 ')) sẽ không được căn chỉnh – watson1180
Trong x64, đối số hàm hỗ trợ liên kết 16 byte, vì vậy vấn đề này biến mất. Tôi biết điều đó không giải quyết được vấn đề ngay lập tức của bạn, nhưng hey, nó nhẹ hơn không có gì. ;) – jalf