only use over-aligned new/delete if needed
diff --git a/.appveyor.yml b/.appveyor.yml
index 5e96940..3d49d56 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -3,6 +3,7 @@
 - Visual Studio 2017
 - Visual Studio 2015
 test: off
+skip_branch_with_pr: true
 build:
   parallel: true
 platform:
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index ff15a41..a7b3e3f 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -574,12 +574,13 @@
             if (type->operator_new) {
                 vptr = type->operator_new(type->type_size);
             } else {
-                #if !defined(PYBIND11_CPP17)
-                    vptr = ::operator new(type->type_size);
-                #else
-                    vptr = ::operator new(type->type_size,
-                                          (std::align_val_t) type->type_align);
+                #if defined(PYBIND11_CPP17)
+                    if (type->type_align > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
+                        vptr = ::operator new(type->type_size,
+                                              (std::align_val_t) type->type_align);
+                    else
                 #endif
+                vptr = ::operator new(type->type_size);
             }
         }
         value = vptr;
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index 9dd71e4..860d1b1 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -988,11 +988,21 @@
     : std::true_type { };
 /// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
 template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
-void call_operator_delete(T *p, size_t) { T::operator delete(p); }
+void call_operator_delete(T *p, size_t, size_t) { T::operator delete(p); }
 template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
-void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); }
+void call_operator_delete(T *p, size_t s, size_t) { T::operator delete(p, s); }
 
-inline void call_operator_delete(void *p, size_t) { ::operator delete(p); }
+inline void call_operator_delete(void *p, size_t s, size_t a) {
+    (void)s; (void)a;
+#if defined(PYBIND11_CPP17)
+    if (a > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
+        ::operator delete(p, s, std::align_val_t(a));
+    else
+        ::operator delete(p, s);
+#else
+    ::operator delete(p);
+#endif
+}
 
 NAMESPACE_END(detail)
 
@@ -1331,7 +1341,10 @@
             v_h.set_holder_constructed(false);
         }
         else {
-            detail::call_operator_delete(v_h.value_ptr<type>(), v_h.type->type_size);
+            detail::call_operator_delete(v_h.value_ptr<type>(),
+                v_h.type->type_size,
+                v_h.type->type_align
+            );
         }
         v_h.value_ptr() = nullptr;
     }