* @brief Tests memory utilities on large buffers (>1MB) that trigger special code paths * in AVX2/AVX512 implementations. This specifically tests the bidirectional * traversal optimization used for huge buffers. */
| 1342 | * traversal optimization used for huge buffers. |
| 1343 | */ |
| 1344 | void test_large_memory_utilities() { |
| 1345 | // Test sizes that trigger the "huge buffer" path (> 1MB) |
| 1346 | std::vector<std::size_t> test_sizes = { |
| 1347 | 1024ull * 1024ull + 1, // Just over 1MB |
| 1348 | 1024ull * 10ull * 103ull, // From GitHub issue #228: 1,055,360 bytes |
| 1349 | 2ull * 1024ull * 1024ull, // 2MB |
| 1350 | 3ull * 1024ull * 1024ull + 7 // 3MB + 7 (unaligned size) |
| 1351 | }; |
| 1352 | |
| 1353 | for (std::size_t size : test_sizes) { |
| 1354 | // Test memcpy with aligned buffers |
| 1355 | { |
| 1356 | std::vector<char> src(size); |
| 1357 | std::vector<char> dst_std(size); |
| 1358 | std::vector<char> dst_sz(size); |
| 1359 | |
| 1360 | // Fill source with pattern to detect copying errors |
| 1361 | for (std::size_t i = 0; i < size; i++) { src[i] = static_cast<char>('A' + (i % 26)); } |
| 1362 | |
| 1363 | std::memcpy(dst_std.data(), src.data(), size); |
| 1364 | sz::memcpy(dst_sz.data(), src.data(), size); |
| 1365 | |
| 1366 | expect_equality(dst_std.data(), dst_sz.data(), size); |
| 1367 | } |
| 1368 | |
| 1369 | // Test memcpy with unaligned buffers |
| 1370 | { |
| 1371 | std::vector<char> src_buf(size + 64); |
| 1372 | std::vector<char> dst_std_buf(size + 64); |
| 1373 | std::vector<char> dst_sz_buf(size + 64); |
| 1374 | |
| 1375 | // Use unaligned pointers |
| 1376 | char *src = src_buf.data() + 7; |
| 1377 | char *dst_std = dst_std_buf.data() + 11; |
| 1378 | char *dst_sz = dst_sz_buf.data() + 11; |
| 1379 | |
| 1380 | for (std::size_t i = 0; i < size; i++) { src[i] = static_cast<char>('a' + (i % 26)); } |
| 1381 | |
| 1382 | std::memcpy(dst_std, src, size); |
| 1383 | sz::memcpy(dst_sz, src, size); |
| 1384 | |
| 1385 | expect_equality(dst_std, dst_sz, size); |
| 1386 | } |
| 1387 | |
| 1388 | // Test memset |
| 1389 | { |
| 1390 | std::vector<char> buf_std(size); |
| 1391 | std::vector<char> buf_sz(size); |
| 1392 | |
| 1393 | std::memset(buf_std.data(), 'Z', size); |
| 1394 | sz::memset(buf_sz.data(), 'Z', size); |
| 1395 | |
| 1396 | expect_equality(buf_std.data(), buf_sz.data(), size); |
| 1397 | } |
| 1398 | |
| 1399 | // Test memmove with overlapping regions |
| 1400 | { |
| 1401 | std::vector<char> buf_std(size); |