The function should return an estimate of uncompressed byte size of its arguments in memory.
E.g. for UInt32 argument it will return constant 4, for String argument - the string length + 9.
The function can take multiple arguments. The typical application is `byteSize(*)`.

**Use case**
Suppose you have a service that stores data for multiple clients in one table. Users will pay per data volume. So, you need to implement accounting of users data volume. The function will allow to calculate the data size on per-row basis.
virtual bool lowCardinality() const { return false; }
    
    virtual bool canBeInsideLowCardinality() const { return false; }
    
    static void updateAvgValueSizeHint(const IColumn & column, double & avg_value_size_hint);
    static String getFileNameForStream(const String & column_name, const SubstreamPath & path);
    
    
    
    static bool isSpecialCompressionAllowed(const SubstreamPath & path);
private:
    friend class DataTypeFactory;
    friend class AggregateFunctionSimpleState;
    
    void setCustomization(DataTypeCustomDescPtr custom_desc_) const;
    
    mutable DataTypeCustomNamePtr custom_name;
    mutable DataTypeCustomTextSerializationPtr custom_text_serialization;
public:
    const IDataTypeCustomName * getCustomName() const { return custom_name.get(); }
};
struct WhichDataType
{
    TypeIndex idx;
    constexpr WhichDataType(TypeIndex idx_ = TypeIndex::Nothing) : idx(idx_) {}
    constexpr WhichDataType(const IDataType & data_type) : idx(data_type.getTypeId()) {}
    constexpr WhichDataType(const IDataType * data_type) : idx(data_type->getTypeId()) {}
    
    WhichDataType(const DataTypePtr & data_type) : idx(data_type->getTypeId()) {}